数据结构C语言实现之二叉树

#include <stdio.h>#include <stdlib.h>#define STACK_MAX_SIZE 30#define QUEUE_MAX_SIZE 30#ifndef elemType typedef char elemType;#endif

/************************************************************************//*                      以下是关于二叉树操作的11个简单算法               *//************************************************************************/ struct BTreeNode{ elemType data; struct BTreeNode *left; struct BTreeNode *right;};

/* 1.初始化二叉树 */void initBTree(struct BTreeNode* *bt){ *bt = NULL; return;}

/* 2.建立二叉树(根据a所指向的二叉树广义表字符串建立) */void createBTree(struct BTreeNode* *bt, char *a){ struct BTreeNode *p; struct BTreeNode *s[STACK_MAX_SIZE];/* 定义s数组为存储根结点指针的栈使用 */ int top = -1; /* 定义top作为s栈的栈顶指针,初值为-1,表示空栈 */ int k; /* 用k作为处理结点的左子树和右子树,k = 1处理左子树,k = 2处理右子树 */ int i = 0; /* 用i扫描数组a中存储的二叉树广义表字符串,初值为0 */ *bt = NULL; /* 把树根指针置为空,即从空树开始建立二叉树 */ /* 每循环一次处理一个字符,直到扫描到字符串结束符\0为止 */ while(a[i] != '\0'){     switch(a[i]){         case ' ':    break;  /* 对空格不作任何处理 */   case '(':    if(top == STACK_MAX_SIZE - 1){        printf("栈空间太小!\n");     exit(1);    }    top++;    s[top] = p;    k = 1;    break;         case ')':    if(top == -1){        printf("二叉树广义表字符串错误!\n");     exit(1);    }    top--;    break;   case ',':    k = 2;    break;   default:    p = malloc(sizeof(struct BTreeNode));    p->data = a[i];    p->left = p->right = NULL;    if(*bt == NULL){     *bt = p;    }else{        if( k == 1){            s[top]->left = p;        }else{            s[top]->right = p;        }    }     }  i++;  /* 为扫描下一个字符修改i值 */ } return;}

/* 3.检查二叉树是否为空,为空则返回1,否则返回0 */int emptyBTree(struct BTreeNode *bt){ if(bt == NULL){     return 1; }else{     return 0; }}

/* 4.求二叉树深度 */int BTreeDepth(struct BTreeNode *bt){ if(bt == NULL){     return 0;  /* 对于空树,返回0结束递归 */ }else{     int dep1 = BTreeDepth(bt->left);  /* 计算左子树的深度 */  int dep2 = BTreeDepth(bt->right);  /* 计算右子树的深度 */  if(dep1 > dep2){      return dep1 + 1;  }else{      return dep2 + 1;  } }}

/* 5.从二叉树中查找值为x的结点,若存在则返回元素存储位置,否则返回空值 */elemType *findBTree(struct BTreeNode *bt, elemType x){ if(bt == NULL){     return NULL; }else{     if(bt->data == x){         return &(bt->data);     }else{ /* 分别向左右子树递归查找 */         elemType *p;   if(p = findBTree(bt->left, x)){       return p;   }   if(p = findBTree(bt->right, x)){       return p;   }   return NULL;     } }}

/* 6.输出二叉树(前序遍历) */void printBTree(struct BTreeNode *bt){ /* 树为空时结束递归,否则执行如下操作 */ if(bt != NULL){     printf("%c", bt->data);  /* 输出根结点的值 */   if(bt->left != NULL || bt->right != NULL){   printf("(");   printBTree(bt->left);   if(bt->right != NULL){       printf(",");   }   printBTree(bt->right);   printf(")");  }    } return;}

/* 7.清除二叉树,使之变为一棵空树 */void clearBTree(struct BTreeNode* *bt){ if(*bt != NULL){     clearBTree(&((*bt)->left));  clearBTree(&((*bt)->right));  free(*bt);  *bt = NULL; } return;}

/* 8.前序遍历 */void preOrder(struct BTreeNode *bt){ if(bt != NULL){     printf("%c ", bt->data);  /* 访问根结点 */  preOrder(bt->left);    /* 前序遍历左子树 */  preOrder(bt->right);   /* 前序遍历右子树 */ } return;}

/* 9.前序遍历 */void inOrder(struct BTreeNode *bt){ if(bt != NULL){  inOrder(bt->left);    /* 中序遍历左子树 */     printf("%c ", bt->data);  /* 访问根结点 */  inOrder(bt->right);    /* 中序遍历右子树 */ } return;}

/* 10.后序遍历 */void postOrder(struct BTreeNode *bt){ if(bt != NULL){  postOrder(bt->left);   /* 后序遍历左子树 */  postOrder(bt->right);   /* 后序遍历右子树 */  printf("%c ", bt->data);  /* 访问根结点 */ } return;}

/* 11.按层遍历 */void levelOrder(struct BTreeNode *bt){ struct BTreeNode *p; struct BTreeNode *q[QUEUE_MAX_SIZE]; int front = 0, rear = 0; /* 将树根指针进队 */ if(bt != NULL){     rear = (rear + 1) % QUEUE_MAX_SIZE;  q[rear] = bt; } while(front != rear){  /* 队列非空 */     front = (front + 1) % QUEUE_MAX_SIZE; /* 使队首指针指向队首元素 */  p = q[front];  printf("%c ", p->data);  /* 若结点存在左孩子,则左孩子结点指针进队 */  if(p->left != NULL){      rear = (rear + 1) % QUEUE_MAX_SIZE;   q[rear] = p->left;  }  /* 若结点存在右孩子,则右孩子结点指针进队 */  if(p->right != NULL){      rear = (rear + 1) % QUEUE_MAX_SIZE;   q[rear] = p->right;  } } return;}

/************************************************************************//*int main(int argc, char *argv[]){ struct BTreeNode *bt; /* 指向二叉树根结点的指针 */ char *b;    /* 用于存入二叉树广义表的字符串 */ elemType x, *px; initBTree(&bt); printf("输入二叉树广义表的字符串:\n"); /* scanf("%s", b); */ b = "a(b(c), d(e(f, g), h(, i)))"; createBTree(&bt, b); if(bt != NULL) printf(" %c ", bt->data); printf("以广义表的形式输出:\n"); printBTree(bt);   /* 以广义表的形式输出二叉树 */ printf("\n"); printf("前序:");  /* 前序遍历 */ preOrder(bt); printf("\n"); printf("中序:");  /* 中序遍历 */ inOrder(bt); printf("\n"); printf("后序:");  /* 后序遍历 */ postOrder(bt); printf("\n"); printf("按层:");  /* 按层遍历 */ levelOrder(bt); printf("\n"); /* 从二叉树中查找一个元素结点 */ printf("输入一个待查找的字符:\n"); scanf(" %c", &x);  /* 格式串中的空格跳过空白字符 */ px = findBTree(bt, x); if(px){     printf("查找成功:%c\n", *px); }else{     printf("查找失败!\n"); } printf("二叉树的深度为:"); printf("%d\n", BTreeDepth(bt)); clearBTree(&bt); return 0;}*/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索struct
, printf
, 二叉树
, return
, null
, 结点
, bt
, 数据结构的广义表
, 二叉树深度遍历可视化
, 二叉树建立
, c语言 树结构 二叉树
, c 二叉树
, 中序 后序 二叉树
, c语言 二叉树
遍历c语言二叉树
数据结构c语言实现、c语言实现二叉树、遍历二叉树 c语言实现、c语言二叉树的实现、数据结构 二叉树,以便于您获取更多的相关知识。

时间: 2024-10-31 01:06:17

数据结构C语言实现之二叉树的相关文章

c语言基础-数据结构C语言版二叉树的问题。

问题描述 数据结构C语言版二叉树的问题. strong text #include "stdio.h" #include "malloc.h" #include "stdlib.h" #include "conio.h" #define stacksize 100 #define DataType char //便于后期修改.可以直接去修改char 类型来达到快速的修改,在程序长的情况下. typedef struct nod

跪求大神-数据结构c语言版 编写:判定二叉树是完全二叉树。

问题描述 数据结构c语言版 编写:判定二叉树是完全二叉树. 求大神,感激不尽 2015-12-22下午2点之前希望有大神解答. 解决方案 无非就是递归遍历,判断参考:http://www.cnblogs.com/buptLizer/archive/2012/03/30/2425097.html 解决方案二: 数据结构(C语言版)摘录--树和二叉树数据结构 二叉树的实现 c语言版C语言数据结构-二叉树

数据结构c语言-数据结构 C语言版 二叉树

问题描述 数据结构 C语言版 二叉树 先根次序访问,后根次序访问,与先序遍历,中序遍历,后序遍历,有什么区别与联系啊 解决方案 这是数据结构里的基础知识啊童鞋!树不是有左子树.右子树和根吗,遍历都是先左子树后右子树,先序.中序和后序是相对于根来说的,所以先根次序.后根次序就是先序.后序遍历的意思,先序遍历:根-左子树-右子树中序遍历:左子树-根-右子树后序遍历:左子树-右子树-根 解决方案二: 先根次序访问就是先序后根次序访问就是后续 对于一个最简单的二叉树abc先序就是先访问a,顺序为abc中

谢谢-数据结构c语言版 编写:判定二叉树是完全二叉树。

问题描述 数据结构c语言版 编写:判定二叉树是完全二叉树. 求大神,感激不尽 2015-12-22下午2点之前希望有大神解答. 解决方案 无非就是递归遍历,判断参考:http://www.cnblogs.com/buptLizer/archive/2012/03/30/2425097.html 解决方案二: 数据结构(C语言版)摘录--树和二叉树数据结构 二叉树的实现 c语言版C语言数据结构-二叉树

数据结构C语言实现之线性表

#include <stdio.h>#include <stdlib.h>typedef int elemType; /************************************************************************//* 以下是关于线性表顺序存储操作的16种算法 *//************************************************************************/struct Lis

数据结构C语言实现之队列

#include <stdio.h>#include <stdlib.h> typedef int elemType;/************************************************************************//* 以下是关于队列链接存储操作的6种算法 *//************************************************************************/struct sNode

归并排序-数据结构C语言顺序表的排序和删除问题

问题描述 数据结构C语言顺序表的排序和删除问题 顺序表定义的长度为10000,此时程序可以正常运行:把顺序表长度改成500000,程序出错,不能运行.求问大神是哪里出了错误,还是要提高存储上限?如何改正?#include #include #include typedef int ElemType; #define MAX 10000 typedef struct{ ElemType *elem; int length; }SqList; void InitList(SqList &L){ L.

无向图的深度遍历-数据结构C语言无向图的深度优先遍历,不知错在那了,遍历不出

问题描述 数据结构C语言无向图的深度优先遍历,不知错在那了,遍历不出 #include #include #define Max 100 #define Wu 0 typedef struct { int vexs[Max]; int arcs[Max][Max]; int vexnum; }MGraph; int visited[Max]; void CreateGraph(MGraph *G,int n) { int i,j,e,u,v,value; for(i=0;i<n;i++) { p

算法-数据结构C语言版 求助

问题描述 数据结构C语言版 求助 设顺序表L中的数据元素非递减有序,试编写一个算法,将e插入L的适当位置,以保持线性表的有序性 定义一个实现以上算法的函数: 数据结构菜鸟,求各位大神相助 解决方案 非递减有序,不就是递增么,说的那么绕干嘛. 既然是有序表,自然是二分查找或者顺序查找,然后插入. 解决方案二: http://zhidao.baidu.com/link?url=pDydQmKmMDqttsXL4CV7byP_o_8m_oRqZhgk_5eCKXDKqwsk1QJathKBqTcxNU