C语言二叉树运算

合集下载

判断一棵树是否为满二叉树的算法c语言

判断一棵树是否为满二叉树的算法c语言

判断一棵树是否为满二叉树的算法c语言判断一棵树是否为满二叉树的算法(C语言)满二叉树是一种特殊的二叉树,每个节点要么没有子节点,要么有两个子节点。

判断一棵树是否为满二叉树的算法可以通过以下步骤实现:1. 定义二叉树的数据结构在C语言中,可以使用结构体定义二叉树的节点。

每个节点包含一个数据域和两个指针域,分别指向左子节点和右子节点。

```cstruct TreeNode {int data;struct TreeNode* left;struct TreeNode* right;};```2. 实现判断函数编写一个递归函数,用于判断给定二叉树是否为满二叉树。

函数的输入参数为根节点指针,返回值为布尔类型。

```cint isFullBinaryTree(struct TreeNode* root) {// 如果根节点为空,则返回真if (root == NULL) {return 1;}// 如果只有一个子节点或没有子节点,则返回假if ((root->left == NULL && root->right != NULL) ||(root->left != NULL && root->right == NULL)) {return 0;}// 递归判断左子树和右子树return isFullBinaryTree(root->left) && isFullBinaryTree(root->right);}```3. 测试样例可以编写一些测试样例来验证判断函数的正确性。

例如,下面是一个满二叉树和一个非满二叉树的示例:```cint main() {// 满二叉树struct TreeNode* root1 = (struct TreeNode*)malloc(sizeof(struct TreeNode));root1->data = 1;root1->left = (struct TreeNode*)malloc(sizeof(struct TreeNode));root1->left->data = 2;root1->left->left = (struct TreeNode*)malloc(sizeof(struct TreeNode));root1->left->left->data = 4;root1->left->left->left = NULL;root1->left->left->right = NULL;root1->left->right = (struct TreeNode*)malloc(sizeof(struct TreeNode));root1->left->right->data = 5;root1->left->right->left = NULL;root1->left->right->right = NULL;root1->right = (struct TreeNode*)malloc(sizeof(struct TreeNode));root1->right->data = 3;root1->right->left = (struct TreeNode*)malloc(sizeof(struct TreeNode));root1->right->left->data = 6;root1->right->left->left = NULL;root1->right->left->right = NULL;root1->right->right = (struct TreeNode*)malloc(sizeof(struct TreeNode));root1->right->right->data = 7;root1->right->right->left = NULL;root1->right->right->right = NULL;// 非满二叉树struct TreeNode* root2 = (struct TreeNode*)malloc(sizeof(struct TreeNode));root2->data = 1;root2->left = (struct TreeNode*)malloc(sizeof(struct TreeNode));root2->left->data = 2;root2->left->left = (struct TreeNode*)malloc(sizeof(struct TreeNode));root2->left->left->data = 4;root2->left->left->left = NULL;root2->left->left->right = NULL;root2->right = (struct TreeNode*)malloc(sizeof(struct TreeNode));root2->right->data = 3;root2->right->left = NULL;root2->right->right = (struct TreeNode*)malloc(sizeof(struct TreeNode));root2->right->right->data = 7;root2->right->right->left = NULL;root2->right->right->right = NULL;// 判断是否为满二叉树if (isFullBinaryTree(root1)) {printf("root1是满二叉树\n");} else {printf("root1不是满二叉树\n");}if (isFullBinaryTree(root2)) {printf("root2是满二叉树\n");} else {printf("root2不是满二叉树\n");}return 0;}```运行上述代码,输出结果为:```root1是满二叉树root2不是满二叉树```根据以上算法和示例,我们可以判断一棵树是否为满二叉树。

数据结构c语言课设-二叉树排序

数据结构c语言课设-二叉树排序

题目:二叉排序树的实现1 内容和要求1)编程实现二叉排序树,包括生成、插入,删除;2)对二叉排序树进展先根、中根、和后根非递归遍历;3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。

4)分别用二叉排序树和数组去存储一个班(50 人以上)的成员信息(至少包括学号、姓名、成绩3 项),比照查找效率,并说明在什么情况下二叉排序树效率高,为什么?2 解决方案和关键代码2.1 解决方案:先实现二叉排序树的生成、插入、删除,编写DisplayBST函数把遍历结果用树的形状表示出来。

前中后根遍历需要用到栈的数据构造,分模块编写栈与遍历代码。

要求比照二叉排序树和数组的查找效率,首先建立一个数组存储一个班的成员信息,分别用二叉树和数组查找,利用clock〔〕函数记录查找时间来比照查找效率。

2.2关键代码树的根本构造定义及根本函数typedef struct{KeyType key;} ElemType;typedef struct BiTNode//定义链表{ElemType data;struct BiTNode *lchild, *rchild;}BiTNode, *BiTree, *SElemType;//销毁树int DestroyBiTree(BiTree &T){if (T != NULL)free(T);return 0;}//清空树int ClearBiTree(BiTree &T){if (T != NULL){T->lchild = NULL;T->rchild = NULL;T = NULL;}return 0;}//查找关键字,指针p返回int SearchBST(BiTree T, KeyType key, BiTree f, BiTree &p) {if (!T){p = f;return FALSE;}else if EQ(key, T->data.key){p = T;return TRUE;}else if LT(key, T->data.key)return SearchBST(T->lchild, key, T, p);elsereturn SearchBST(T->rchild, key, T, p);}二叉树的生成、插入,删除生成void CreateBST(BiTree &BT, BiTree p){int i;ElemType k;printf("请输入元素值以创立排序二叉树:\n");scanf_s("%d", &k.key);for (i = 0; k.key != NULL; i++){//判断是否重复if (!SearchBST(BT, k.key, NULL, p)){InsertBST(BT, k);scanf_s("%d", &k.key);}else{printf("输入数据重复!\n");return;}}}插入int InsertBST(BiTree &T, ElemType e){BiTree s, p;if (!SearchBST(T, e.key, NULL, p)){s = (BiTree)malloc(sizeof(BiTNode));s->data = e;s->lchild = s->rchild = NULL;if (!p)T = s;else if LT(e.key, p->data.key)p->lchild = s;elsep->rchild = s;return TRUE;}else return FALSE;}删除//某个节点元素的删除int DeleteEle(BiTree &p){BiTree q, s;if (!p->rchild) //右子树为空{q = p;p = p->lchild;free(q);}else if (!p->lchild) //左子树为空{q = p;p = p->rchild;free(q);}else{q = p;s = p->lchild;while (s->rchild){q = s;s = s->rchild;}p->data = s->data;if (q != p)q->rchild = s->lchild;elseq->lchild = s->lchild;delete s;}return TRUE;}//整棵树的删除int DeleteBST(BiTree &T, KeyType key) //实现二叉排序树的删除操作{if (!T){return FALSE;}else{if (EQ(key, T->data.key)) //是否相等return DeleteEle(T);else if (LT(key, T->data.key)) //是否小于return DeleteBST(T->lchild, key);elsereturn DeleteBST(T->rchild, key);}return 0;}二叉树的前中后根遍历栈的定义typedef struct{SElemType *base;SElemType *top;int stacksize;}SqStack;int InitStack(SqStack &S) //构造空栈{S.base = (SElemType*)malloc(STACK_INIT_SIZE *sizeof(SElemType));if (!S.base) exit(OVERFLOW);S.top = S.base;S.stacksize = STACK_INIT_SIZE;return OK;}//InitStackint Push(SqStack &S, SElemType e) //插入元素e为新栈顶{if (S.top - S.base >= S.stacksize){S.base = (SElemType*)realloc(S.base, (S.stacksize + STACKINCREMENT)*sizeof(SElemType));if (!S.base) exit(OVERFLOW);S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top++ = e;return OK;}//Pushint Pop(SqStack &S, SElemType &e) //删除栈顶,应用e返回其值{if (S.top == S.base) return ERROR;e = *--S.top;return OK;}//Popint StackEmpty(SqStack S) //判断是否为空栈{if (S.base == S.top) return TRUE;return FALSE;}先根遍历int PreOrderTraverse(BiTree T, int(*Visit)(ElemType e)) {SqStack S;BiTree p;InitStack(S);p = T;while (p || !StackEmpty(S)){if (p){Push(S, p);if (!Visit(p->data)) return ERROR;p = p->lchild;}else{Pop(S, p);p = p->rchild;}}return OK;}中根遍历int InOrderTraverse(BiTree T, int(*Visit)(ElemType e)) {SqStack S;BiTree p;InitStack(S);p = T;while (p || !StackEmpty(S)){if (p){Push(S, p);p = p->lchild;}else{Pop(S, p);if (!Visit(p->data)) return ERROR;p = p->rchild;}}return OK;}后根遍历int PostOrderTraverse(BiTree T, int(*Visit)(ElemType e)) {SqStack S, SS;BiTree p;InitStack(S);InitStack(SS);p = T;while (p || !StackEmpty(S)){if (p){Push(S, p);Push(SS, p);p = p->rchild;}else{if (!StackEmpty(S)){Pop(S, p);p = p->lchild;}}}while (!StackEmpty(SS)){Pop(SS, p);if (!Visit(p->data)) return ERROR;}return OK;}利用数组存储一个班学生信息ElemType a[] = { 51, "陈继真", 88,82, "黄景元", 89,53, "贾成", 88,44, "呼颜", 90,25, "鲁修德", 88,56, "须成", 88,47, "孙祥", 87, 38, "柏有患", 89, 9, " 革高", 89, 10, "考鬲", 87, 31, "李燧", 86, 12, "夏祥", 89, 53, "余惠", 84, 4, "鲁芝", 90, 75, "黄丙庆", 88, 16, "李应", 89, 87, "杨志", 86, 18, "李逵", 89, 9, "阮小五", 85, 20, "史进", 88, 21, "秦明", 88, 82, "杨雄", 89, 23, "刘唐", 85, 64, "武松", 88, 25, "李俊", 88, 86, "卢俊义", 88, 27, "华荣", 87, 28, "杨胜", 88, 29, "林冲", 89, 70, "李跃", 85, 31, "蓝虎", 90, 32, "宋禄", 84, 73, "鲁智深", 89, 34, "关斌", 90, 55, "龚成", 87, 36, "黄乌", 87, 57, "孔道灵", 87, 38, "张焕", 84, 59, "李信", 88, 30, "徐山", 83, 41, "秦祥", 85, 42, "葛公", 85, 23, "武衍公", 87, 94, "范斌", 83, 45, "黄乌", 60, 67, "叶景昌", 99, 7, "焦龙", 89, 78, "星姚烨", 85, 49, "孙吉", 90, 60, "陈梦庚", 95,};数组查询函数void ArraySearch(ElemType a[], int key, int length){int i;for (i = 0; i <= length; i++){if (key == a[i].key){cout << "学号:" << a[i].key << " 姓名:" << a[i].name << " 成绩:" << a[i].grade << endl;break;}}}二叉树查询函数上文二叉树根本函数中的SearchBST()即为二叉树查询函数。

C语言递归生成二叉树探讨

C语言递归生成二叉树探讨




saf” ” ) cr(%c, ; &c
c=tr n t rtm U L = e ae eu N L mi )
es le
t 、





蹶 。
≮ 。
■‘ 、
ro=B o e) l cs ef N d) ot(N d ma o(zo( o e ; l i B )
2二 叉 树 递 归 生 成 .
可 以利 用二 叉树 基本 性 质 . 即从 根 结点 开始 。 断 不 给 当前 叶子结点 添加左 、 右新 的子 结 点 , 成整 棵完 整 生 的二叉树 。这里 , 以前序 递归 方法 为例来 介绍 。需要 注 意 的是输 入时按先 序遍 历次 序输入 二 叉树 中结 点 的字 符值 . 同时要 把左 右子树 为空 的结 点也 要表 示 出来 , 该 文用 、 表 示空树 。 下面 给 出几 种 C语 言实 现方案 : 使用 的宏 定 义 :
# e n t r n t d f e e mi a e i
# e n OK df e i 1
# e i e ERROR d fn 0
方法 1 :
B re c t( Te  ̄ac )(
BT e o t NUL rero= L:
c a ; h c r源自④ : 法。 【 关键词 】 二 叉树 ; : C语 言 ; 归 递
1 引言 .
二 叉树 是一 种基 本 的非 线性 数据 结构 .二叉 链 表 是 其常用 的存储形 式 。用 二 叉链 表实 现生 成二 叉树 的 算 法 比较多 .其 中递归 生成 及递 归遍 历二叉 树 属 于二 叉 树的基本 操作 。 目前无 论在 教学或 实用 使用 中 , 大都 采 用 C、 + 或 C C+ #编 程实 现 ,其 中用 面 向过程 基 本 C 语 言编程属 于重要 的基本 实现 方法 。该 文在 基 于基本 C语 言 环 境 下 对 实现 生 成 二 叉 树 及 遍 历 进 行 一 些 探

二叉排序树c语言代码实现

二叉排序树c语言代码实现
printf ("是否继续输入?\n 1.是 2.否(其他键 退出)\n");
if ((*n) != NULL) {
free (*n);
*n = NULL;
}
}
/* 查找结点 */
PNODE find_node (PNODE n, int value) {
in_order_traversal ( n->right);
}
}
int main() {
char buf[50],a[1000];
int i,n,option,s[80],p;
PNODE tree = NULL;/*树的第一个结点*/
PNODE node = NULL;
{
r = (PNODE)malloc(sizeof(NODE));
if(!r)
{
printf("内存分配失败!");
exit(0);
zjm3:fgets (buf, sizeof(buf), stdin);
sscanf (buf, "%i", &option);
printf ("\n\n");
if(option<0) {
printf ("输入错误,请重新输入该元素\n",n);
goto zjm3;}
if(find_node (tree, option))
{
(*n)->value = value;
(*n)->left = NULL;
(*n)->right = NULL;
}
}

数据结构-C语言-树和二叉树

数据结构-C语言-树和二叉树

练习
一棵完全二叉树有5000个结点,可以计算出其
叶结点的个数是( 2500)。
二叉树的性质和存储结构
性质4: 具有n个结点的完全二叉树的深度必为[log2n]+1
k-1层 k层
2k−1−1<n≤2k−1 或 2k−1≤n<2k n k−1≤log2n<k,因为k是整数
所以k = log2n + 1
遍历二叉树和线索二叉树
遍历定义
指按某条搜索路线遍访每个结点且不重复(又称周游)。
遍历用途
它是树结构插入、删除、修改、查找和排序运算的前提, 是二叉树一切运算的基础和核心。
遍历规则 D
先左后右
L
R
DLR LDR LRD DRL RDL RLD
遍历规则
A BC DE
先序遍历:A B D E C 中序遍历:D B E A C 后序遍历:D E B C A
练习 具有3个结点的二叉树可能有几种不同形态?普通树呢?
5种/2种
目 录 导 航 Contents
5.1 树和二叉树的定义 5.2 案例引入 5.3 树和二叉树的抽象数据类型定义 5.4 二叉树的性质和存储结构 5.5 遍历二叉树和线索二叉树 5.6 树和森林 5.7 哈夫曼树及其应用 5.8 案例分析与实现
(a + b *(c-d)-e/f)的二叉树
目 录 导 航 Contents
5.1 树和二叉树的定义 5.2 案例引入 5.3 树和二叉树的抽象数据类型定义 5.4 二叉树的性质和存储结构 5.5 遍历二叉树和线索二叉树 5.6 树和森林 5.7 哈夫曼树及其应用 5.8 案例分析与实现
二叉树的抽象数据类型定义
特殊形态的二叉树
只有最后一层叶子不满,且全部集中在左边

c语言二叉树的先序,中序,后序遍历

c语言二叉树的先序,中序,后序遍历

c语言二叉树的先序,中序,后序遍历1、先序遍历先序遍历可以想象为,一个小人从一棵二叉树根节点为起点,沿着二叉树外沿,逆时针走一圈回到根节点,路上遇到的元素顺序,就是先序遍历的结果先序遍历结果为:A B D H I E J C F K G2、中序遍历中序遍历可以看成,二叉树每个节点,垂直方向投影下来(可以理解为每个节点从最左边开始垂直掉到地上),然后从左往右数,得出的结果便是中序遍历的结果中遍历结果为:H D I B E J A F K C G3、后序遍历后序遍历就像是剪葡萄,我们要把一串葡萄剪成一颗一颗的。

还记得我上面提到先序遍历绕圈的路线么?(不记得翻上面理解)就是围着树的外围绕一圈,如果发现一剪刀就能剪下的葡萄(必须是一颗葡萄)(也就是葡萄要一个一个掉下来,不能一口气掉超过1个这样),就把它剪下来,组成的就是后序遍历了。

后序遍历中,根节点默认最后面后序遍历结果:H I D J E B K F G C A4、口诀先序遍历:先根再左再右中序遍历:先左再根再右后序遍历:先左再右再根这里的根,指的是每个分叉子树(左右子树的根节点)根节点,并不只是最开始头顶的根节点,需要灵活思考理解5、代码展示#include<stdio.h>#include<stdlib.h>typedef struct Tree{int data; // 存放数据域struct Tree *lchild; // 遍历左子树指针struct Tree *rchild; // 遍历右子树指针}Tree,*BitTree;BitTree CreateLink(){int data;int temp;BitTree T;scanf("%d",&data); // 输入数据temp=getchar(); // 吸收空格if(data == -1){ // 输入-1 代表此节点下子树不存数据,也就是不继续递归创建return NULL;}else{T = (BitTree)malloc(sizeof(Tree)); // 分配内存空间T->data = data; // 把当前输入的数据存入当前节点指针的数据域中printf("请输入%d的左子树: ",data);T->lchild = CreateLink(); // 开始递归创建左子树printf("请输入%d的右子树: ",data);T->rchild = CreateLink(); // 开始到上一级节点的右边递归创建左右子树return T; // 返回根节点}}// 先序遍历void ShowXianXu(BitTree T) // 先序遍历二叉树{if(T==NULL) //递归中遇到NULL,返回上一层节点{return;}printf("%d ",T->data);ShowXianXu(T->lchild); // 递归遍历左子树ShowXianXu(T->rchild); // 递归遍历右子树}// 中序遍历void ShowZhongXu(BitTree T) // 先序遍历二叉树{if(T==NULL) //递归中遇到NULL,返回上一层节点{return;}ShowZhongXu(T->lchild); // 递归遍历左子树printf("%d ",T->data);ShowZhongXu(T->rchild); // 递归遍历右子树}// 后序遍历void ShowHouXu(BitTree T) // 后序遍历二叉树{if(T==NULL) //递归中遇到NULL,返回上一层节点{return;}ShowHouXu(T->lchild); // 递归遍历左子树ShowHouXu(T->rchild); // 递归遍历右子树printf("%d ",T->data);}int main(){BitTree S;printf("请输入第一个节点的数据:\n");S = CreateLink(); // 接受创建二叉树完成的根节点printf("先序遍历结果: \n");ShowXianXu(S); // 先序遍历二叉树printf("\n中序遍历结果: \n");ShowZhongXu(S); // 中序遍历二叉树printf("\n后序遍历结果: \n");ShowHouXu(S); // 后序遍历二叉树return 0;}。

c语言中,深度为5的完全二叉树的结点数范围

c语言中,深度为5的完全二叉树的结点数范围

c语言中,深度为5的完全二叉树的结点数范围深度为5的完全二叉树是一种特殊的二叉树结构,它具有许多独特的性质和应用。

在本文中,我们将全面地探讨深度为5的完全二叉树的结点数范围,并解释它们对于算法和数据结构的指导意义。

首先,让我们明确一下深度与结点数之间的关系。

在深度为5的完全二叉树中,根节点位于第一层,每个节点的左右子树高度不超过1。

根据二叉树的性质,第二层会有2个节点,第三层会有4个节点,依此类推。

因此,在深度为5的完全二叉树中,第一层有1个节点,第二层有2个节点,第三层有4个节点,第四层有8个节点,第五层有16个节点。

根据结点数与深度的关系,我们可以总结出结点数的规律如下:第一层:1个节点第二层:2个节点第三层:4个节点第四层:8个节点第五层:16个节点因此,深度为5的完全二叉树的结点数范围为1到16个。

这个范围非常有用,在算法和数据结构中有着广泛的应用。

首先,深度为5的完全二叉树是一种高度平衡的二叉树。

高度平衡的二叉树具有较短的搜索路径,可以提高数据的查找和插入效率。

因此,在某些要求高效率的算法中,选择深度为5的完全二叉树作为数据结构是一个明智的选择。

其次,深度为5的完全二叉树提供了一种简洁有效的方式来组织数据。

在许多应用中,我们需要将数据按照一定的顺序进行存储和访问。

深度为5的完全二叉树可以通过层级关系来组织数据,使得数据的访问和操作更加高效。

例如,当我们需要对一组数据进行排序时,可以使用深度为5的完全二叉树来实现快速的排序算法,例如堆排序。

此外,深度为5的完全二叉树还可以用作哈夫曼树的基础结构。

哈夫曼树是一种经常用于数据压缩的树形结构,它能够根据数据的出现频率构建一棵频率最低的二叉树,从而实现数据的高效压缩和解压缩。

在哈夫曼树的构建过程中,深度为5的完全二叉树可以作为其中的一个重要组成部分。

总结而言,深度为5的完全二叉树的结点数范围为1到16个,该范围具有许多重要的应用和指导意义。

它作为一种高度平衡的二叉树,可以提高算法的效率;它作为一种数据组织结构,可以简化数据的存储和访问;它作为哈夫曼树的基础结构,可以实现高效的数据压缩和解压缩。

c语言基于二叉树的表达式求值算法

c语言基于二叉树的表达式求值算法

c语言基于二叉树的表达式求值算法C语言中,基于二叉树的表达式求值算法主要包括两部分:中缀表达式转换为后缀表达式和后缀表达式求值。

1.中缀表达式转换为后缀表达式中缀表达式是我们常见的数学表达方式,例如3 + 4 * 2 - 5。

为了方便计算机求值,我们需要将中缀表达式转换为后缀表达式,也叫做逆波兰表达式。

转换的过程使用栈数据结构来实现。

具体算法如下:1.定义一个栈和一个结果字符串,栈用于存储操作符,结果字符串用于保存后缀表达式。

2.从左到右遍历中缀表达式的每一个字符。

3.如果当前字符是数字,直接将其加入结果字符串。

4.如果当前字符是左括号"(",将其入栈。

5.如果当前字符是右括号")",则依次将栈顶的操作符弹出并加入结果字符串,直到遇到左括号为止,同时将左括号从栈中弹出。

6.如果当前字符是操作符,需要将栈中优先级比当前操作符高或者相等的操作符弹出并加入结果字符串,然后将当前操作符入栈。

7.遍历完所有字符后,将栈中剩余的操作符依次弹出并加入结果字符串。

8.最终结果字符串就是后缀表达式。

例如,对于中缀表达式3 + 4 * 2 - 5,转换为后缀表达式为3 4 2 * + 5 -2.后缀表达式求值后缀表达式求值算法使用栈数据结构来实现。

具体算法如下:1.定义一个栈,用于存储操作数。

2.从左到右遍历后缀表达式的每一个字符。

3.如果当前字符是数字,则将其转换为对应的整数并入栈。

4.如果当前字符是操作符,则从栈中弹出两个操作数,先弹出的作为右操作数,后弹出的作为左操作数,根据操作符进行运算,得到结果后入栈。

5.遍历完所有字符后,栈顶的数字即为最终的结果。

例如,对于后缀表达式3 4 2 * + 5 -,求值的过程如下:1.入栈3。

2.入栈4。

3.入栈2。

4.弹出2和4,计算4 * 2 = 8,将8入栈。

5.弹出8和3,计算3 + 8 = 11,将11入栈。

6.入栈5。

7.弹出5和11,计算11 - 5 = 6,得到最终结果。

二叉树的创建c语言代码

二叉树的创建c语言代码

以下是一个简单的C 语言代码示例,用于创建一个二叉树:#include <stdio.h>#include <stdlib.h>// 二叉树节点结构struct TreeNode {int data;struct TreeNode* left;struct TreeNode* right;};// 创建一个新的二叉树节点struct TreeNode* createNode(int data) {struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode));newNode->data = data;newNode->left = NULL;newNode->right = NULL;return newNode;}// 将一个数据插入到二叉树中struct TreeNode* insert(struct TreeNode* root, int data) {if (root == NULL) {return createNode(data);} else {if (data <= root->data) {root->left = insert(root->left, data);} else {root->right = insert(root->right, data);}return root;}}// 中序遍历打印二叉树void inOrderTraversal(struct TreeNode* root) {if (root != NULL) {inOrderTraversal(root->left);printf("%d ", root->data);inOrderTraversal(root->right);}}int main() {struct TreeNode* root = NULL;root = insert(root, 10);insert(root, 5);insert(root, 15);insert(root, 8);insert(root, 3);printf("中序遍历结果:");inOrderTraversal(root);printf("\n");return 0;}在上面的示例中,我们定义了一个简单的二叉树结构,并编写了函数来创建节点、插入节点和中序遍历打印二叉树。

数据结构——用C语言描述(第3版)教学课件第6章 树与二叉树

数据结构——用C语言描述(第3版)教学课件第6章 树与二叉树

6.2 二叉树 6.2.1 二叉树的定义与基本操作 6.2.2 二叉树的性质 6.2.3 二叉树的存储结构
6.2.1 二叉树的定义与基本操作 定义:我们把满足以下两个条件的树型结构叫做二 叉树(Binary Tree): (1)每个结点的度都不大于2; (2)每个结点的孩子结点次序不能任意颠倒。
有序树:在树T中,如果各子树Ti之间是有先后次序的,则称为有序树。 森林:m(m≥0)棵互不相交的树的集合。将一棵非空树的根结点删去,树就变成一 个森林;反之,给森林增加一个统一的根结点,森林就变成一棵树。
同构:对两棵树,通过对结点适当地重命名,就可以使两棵树完全相等(结点对应相 等,对应结点的相关关系也像等),则称这两棵树同构。
二叉树的基本结构由根结点、左子树和右子树组成
如图示
LChild Data RChild
Data
LChild RChild
用L、D、R分别表示遍历左子树、访问根结点、遍 历右子树,那么对二叉树的遍历顺序就可以有:
(1) 访问根,遍历左子树,遍历右子树(记做DLR)。 (2) 访问根,遍历右子树,遍历左子树(记做DRL)。 (3) 遍历左子树,访问根,遍历右子树(记做LDR)。 (4) 遍历左子树,遍历右子树,访问根 (记做LRD)。 (5) 遍历右子树,访问根,遍历左子树 (记做RDL)。 (6) 遍历右子树,遍历左子树,访问根 (记做RLD)。
(8) NextSibling(Tree,x): 树Tree存在,x是Tree中的某个结点。若x不 是其双亲的最后一个孩子结点,则返回x后面的下一个兄弟结点,否则 返回“空”。
基本操作:
(9) InsertChild(Tree,p,Child): 树Tree存在,p指向Tree 中某个结点,非空树Child与Tree不相交。将Child插入Tree中, 做p所指向结点的子树。

二叉树c语言的程序代码

二叉树c语言的程序代码

# include "stdio.h"# include "stdlib.h"# include "malloc.h"typedef struct Node{char data; //定义根结点struct Node *lchild; //定义左子树struct Node *rchild; //定义右子树}Node,*BiTree;int JianShu(BiTree &T) { //构造二叉链表表示的二叉树T,按先序遍历输入二//叉树中结点的值(一个字符),空格字符表示空树.char e;T=(Node *)malloc(sizeof(Node)); //开辟一个以sizeof(Node)为单位的空间if(!T) //开辟失败exit (-2);fflush(stdin); //清空缓存scanf ("%c",&e);if(e==' ')T=NULL;else {T->data=e; // 生成根结点printf ("请输入%c的左孩子:",e);JianShu(T->lchild); // 构造左子树printf ("请输入%c的右孩子:",e);JianShu(T->rchild); // 构造右子树}return 1;}int DLR_P(BiTree &T) { //先序遍历打印二叉树中所有数据if (T!=NULL) { //非空二叉树printf ("%c ",T->data); //访问TDLR_P(T->lchild); //递归遍历左子树DLR_P(T->rchild); //递归遍历右子树}return 1;}int LDR_P(BiTree &T) { //中序遍历打印二叉树中所有数据if (T!=NULL) { //非空二叉树LDR_P(T->lchild); //递归遍历左子树printf ("%c ",T->data); //访问TLDR_P(T->rchild); //递归遍历右子树}return 1;}int LRD_P(BiTree &T) { //后序遍历打印二叉树中所有数据if (T!=NULL) { //非空二叉树LRD_P(T->lchild); //递归遍历左子树LRD_P(T->rchild); //递归遍历右子树printf ("%c ",T->data); //访问T}return 1;}int DLR_0(BiTree &T,int &s_0) { //用先序遍历求二叉树T中所有叶子总数if (T!=NULL) { //非空二叉树if(!T->lchild&&!T->rchild) { //判断该结点是否为叶子s_0++; //是叶子则计数并打印printf ("%c ",T->data);}DLR_0(T->lchild,s_0); //递归遍历左子树,直到叶子处DLR_0(T->rchild,s_0); //递归遍历右子树,直到叶子处}return s_0;}int DLR_1(BiTree &T,int &s_1) { //用先序遍历求二叉树T中所有1度结点总数if (T!=NULL) { //非空二叉树if(T->lchild&&!T->rchild) { //判断该结点是否为1度结点s_1++; //是1度结点则计数并打印printf ("%c ",T->data);}if(!T->lchild&&T->rchild) { //判断该结点是否为1度结点s_1++; //是1度结点则计数并打印printf ("%c ",T->data);}DLR_1(T->lchild,s_1); //递归遍历左子树,直到1度结点处DLR_1(T->rchild,s_1); //递归遍历右子树,直到1度结点处}return s_1;}int DLR_2(BiTree &T,int &s_2) { //用先序遍历求二叉树T中所有2度结点总数if (T!=NULL) { //非空二叉树if(T->lchild&&T->rchild) { //判断该结点是否为2度结点s_2++; //是2度结点则计数并打印printf ("%c ",T->data);}DLR_2(T->lchild,s_2); //递归遍历左子树,直到2度结点处DLR_2(T->rchild,s_2); //递归遍历右子树,直到2度结点处}return s_2;}int ShenDu(BiTree &T,int l,int &h) { //用递归求二叉树的深度if (T!=NULL) { //非空二叉树l=l+1;if (l>h) h=l;ShenDu(T->lchild,l,h); //递归遍历左子树ShenDu(T->rchild,l,h); //递归遍历右子树}return 1;}int QingKong(BiTree &T) { //清空二叉树if (T!=NULL) {QingKong(T->lchild); //遍历清空左子树free(T->lchild);QingKong(T->rchild); //遍历清空右子树free(T->rchild);}return 1;}int main () { //主函数int i,a=0;Node *T; //定义一个二叉树Twhile(1) {system("cls");printf("\t|===========================================================|\t\n");printf ("\t| |\t\n");printf ("\t| 二叉树的链式存储|\t\n");printf ("\t| |\t\n");printf("\t|===========================================================|\t\n");printf ("\n\t【1】建立二叉树及先序输入!\t 【2】遍历二叉树打印!\n");printf ("\n\t【3】打印各结点并统计! \t 【4】求二叉树的深度!\n");printf ("\n\t【5】清空二叉树!\t\t 【0】退出程序!\n");system("color F0");printf ("\n\n\t\t\t请输入你的选择:"); //输入选择的功能序号scanf ("%d",&i);switch(i) {case 1: //建立二叉树T并输入数据printf ("请输入二叉树T的根:");JianShu(T);a=1;system("pause");break;case 2: //遍历打印二叉树中所有数据if(a==1) {if(T!=NULL) { //非空二叉树Tprintf ("先序遍历打印结果:"); //执行先序遍历并打印DLR_P(T);printf ("\n\n中序遍历打印结果:"); //执行中序遍历并打印LDR_P(T);printf ("\n\n后序遍历打印结果:"); //执行后序遍历并打印LRD_P(T);printf ("\n");}elseprintf ("二叉树T为空树!\n");}else //未建立二叉树printf ("未建立二叉树!\n");system("pause");break;case 3: //先序遍历打印二叉树中0度1度2度结点if(a==1) {if(T!=NULL) { //非空二叉树Tint s_0=0,s_1=0,s_2=0;printf ("二叉树中叶子:");DLR_0(T,s_0); //执行先序遍历打印叶子并统计printf ("共有%d个叶子!\n",s_0);printf ("\n二叉树中1度结点:");DLR_1(T,s_1); //执行先序遍历打印1度结点并统计printf ("共有%d个1度结点!\n",s_1);printf ("\n二叉树中2度结点:");DLR_2(T,s_2); //执行先序遍历打印2度结点并统计printf ("共有%d个2度结点!\n",s_2);}elseprintf ("二叉树T为空树!\n");}else //未建立二叉树printf ("未建立二叉树!\n");system("pause");break;case 4: //用递归求二叉树的深度if(a==1) {if(T!=NULL) { //非空二叉树Tint l=0,h=0;ShenDu(T,l,h);printf ("二叉树的深度为%d.\n",h);}elseprintf ("二叉树T为空树!\n");}else //未建立二叉树printf ("未建立二叉树!\n");system("pause");break;case 5: //清空二叉树if(a==1) {if(T!=NULL) { //非空二叉树QingKong(T); //清空二叉树T=NULL;printf ("二叉树已清空!\n");}elseprintf ("二叉树T为空树,既不用清空!\n");}else //未建立二叉树printf ("未建立二叉树,既不用清空!\n");system("pause");break;case 0: //退出程序printf ("退出程序!\n");return 1;default: //重新输入选择的功能序号printf ("输入有误,请重新输入!\n");system("pause");break;}}}。

c语言二叉树的算法代码

c语言二叉树的算法代码

c语言二叉树的算法代码C语言二叉树的算法代码二叉树是一种常用的数据结构,它由节点组成,每个节点最多有两个子节点:左子节点和右子节点。

在C语言中,我们可以使用指针来表示二叉树的节点,并通过指针的操作来实现对二叉树的插入、删除、查找等操作。

我们需要定义一个二叉树节点的结构体,它包含一个数据域和两个指针域,分别指向左子节点和右子节点。

代码如下:```cstruct TreeNode {int data; // 数据域struct TreeNode* left; // 左子节点指针struct TreeNode* right; // 右子节点指针};```接下来,我们可以实现二叉树的插入操作。

插入操作的主要思路是,首先确定要插入的节点位置,然后创建一个新节点,并将其链接到正确的位置上。

代码如下:```cstruct TreeNode* insertNode(struct TreeNode* root, intvalue) {if (root == NULL) {// 如果树为空,则创建一个新节点并返回struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode));newNode->data = value;newNode->left = NULL;newNode->right = NULL;return newNode;}if (value < root->data) {// 如果要插入的值小于当前节点的值,则递归地插入到左子树中root->left = insertNode(root->left, value);} else {// 如果要插入的值大于等于当前节点的值,则递归地插入到右子树中root->right = insertNode(root->right, value);}return root;}除了插入操作,我们还可以实现二叉树的查找操作。

完全二叉树计数c语言

完全二叉树计数c语言

完全二叉树计数c语言完全二叉树是一种特殊的二叉树结构,它的每一层都是满的,除了最后一层外,其他层的节点数都是满的。

本文将介绍完全二叉树的计数方法,并用C语言实现。

完全二叉树的计数问题是一个经典的数学问题,也是计算机科学中的重要内容。

在解决这个问题之前,我们先来了解一下完全二叉树的特点和性质。

完全二叉树具有以下性质:1. 如果完全二叉树的深度为h,那么叶子节点的个数为2^(h-1)到2^h-1之间。

2. 完全二叉树的节点数为2^h-1个,其中h为完全二叉树的深度。

3. 完全二叉树的第i个节点,如果i大于1,则其父节点为i/2,左子节点为2i,右子节点为2i+1。

现在我们来考虑如何计算完全二叉树的节点数。

一种简单的方法是遍历整个二叉树,统计节点的个数。

但是这种方法的时间复杂度较高,为O(n),其中n是节点的个数。

我们可以使用数学的方法来计算完全二叉树的节点数。

假设完全二叉树的深度为h,节点数为n。

根据性质1,叶子节点的个数为2^(h-1)到2^h-1之间,即2^(h-1) <= n <= 2^h-1。

我们可以通过不断调整h的值,来逼近n的值。

我们可以确定n的上界,即2^h-1。

然后,我们可以使用二分法来逼近n的值。

假设当前的上界为upper,下界为lower,中点为mid。

如果mid是一个可能的节点数,那么我们将上界调整为mid,否则将下界调整为mid+1。

这样,我们可以在O(logn)的时间内找到最接近n的节点数。

下面是使用C语言实现完全二叉树计数的代码:```c#include <stdio.h>// 计算完全二叉树的节点数int countNodes(int n) {int h = 0; // 完全二叉树的深度int upper = 1; // 节点数的上界int lower = 0; // 节点数的下界// 确定完全二叉树的深度while (n >= upper) {lower = upper;upper = upper * 2;h++;}// 使用二分法逼近节点数while (lower < upper) {int mid = lower + (upper - lower) / 2;if (mid < n && mid * 2 <= n) {lower = mid + 1;} else {upper = mid;}}return upper;}int main() {int n;printf("请输入完全二叉树的节点数:");scanf("%d", &n);int count = countNodes(n);printf("完全二叉树的节点数为:%d\n", count);return 0;}```在上面的代码中,我们首先确定完全二叉树的深度h,然后使用二分法逼近节点数。

中序遍历二叉树的递归算法c语言代码

中序遍历二叉树的递归算法c语言代码

中序遍历二叉树的递归算法c语言代码二叉树的中序遍历递归算法是左子树-> 根节点-> 右子树。

以下是C语言代码实现:```c#include <stdio.h>#include <stdlib.h>// 定义二叉树节点结构体struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;};// 定义二叉树中序遍历函数void inorderTraversal(struct TreeNode *root) {if (root == NULL) { // 如果根节点为空,直接返回return;}inorderTraversal(root->left); // 先遍历左子树printf("%d ", root->val); // 输出根节点值inorderTraversal(root->right); // 最后遍历右子树}int main() {// 创建一棵二叉树struct TreeNode *root = (struct TreeNode*)malloc(sizeof(struct TreeNode));struct TreeNode *node1 = (struct TreeNode*)malloc(sizeof(struct TreeNode));struct TreeNode *node2 = (struct TreeNode*)malloc(sizeof(struct TreeNode));struct TreeNode *node3 = (struct TreeNode*)malloc(sizeof(struct TreeNode));struct TreeNode *node4 = (struct TreeNode*)malloc(sizeof(struct TreeNode));struct TreeNode *node5 = (struct TreeNode*)malloc(sizeof(struct TreeNode));struct TreeNode *node6 = (struct TreeNode*)malloc(sizeof(struct TreeNode));struct TreeNode *node7 = (struct TreeNode*)malloc(sizeof(struct TreeNode));struct TreeNode *node8 = (struct TreeNode*)malloc(sizeof(struct TreeNode));struct TreeNode *node9 = (struct TreeNode*)malloc(sizeof(struct TreeNode));node1->val = 1;node1->left = node2;node1->right = node3;node2->val = 2;node2->left = NULL;node2->right = NULL;node3->val = 3;node3->left = node4;node3->right = node5;node4->val = 4;node4->left = NULL;node4->right = NULL;node5->val = 5;node5->left = NULL;node5->right = NULL;root->val = 0; // 设置根节点值为0,这样在遍历时会跳过根节点输出0,避免输出多个根节点值。

浅析一种二叉树非递归遍历算法的C语言实现论文.doc

浅析一种二叉树非递归遍历算法的C语言实现论文.doc

浅析一种二叉树非递归遍历算法的C语言实现论文一种二叉树非递归遍历算法的C语言实现论文导读:本论文是一篇关于一种二叉树非递归遍历算法的C语言实现的优秀论文范文,对正在写有关于递归论文的写有一定的参考和指导作用,摘要:针对二叉树的链式存储结构,分析了二叉树的各种遍历算法,探讨了递归算法的递推消除理由,提出了一种改善的非递归遍历算法并用C语言予以实现。

关键词:二叉树;遍历算法;非递归;C语言实现1009-3044(2014)01-0223-031 概述树形结构是一种非常常见的数据结构,而二叉树又是其中最重要的一种树形结构。

二叉树的遍历是指按照一定的规则和次序将二叉树中的每一个结点都访问一次,既不能重复,也不能漏掉。

一般而言,对二叉树的遍历有前序遍历、中序遍历、后序遍历和按层遍历等几种方式。

在具体的算法设计上,以上遍历方式一般采取递归算法来实现,该文将探讨采用非递归算法来实现二叉树的遍历。

2 二叉树的数据结构描述二叉树作为一种非线性结构,每个结点最多有一个双亲结点和两个子结点。

二叉树可以采用顺序存储结构和链式存储结构。

对于完全二叉树而言,采用顺序存储是非常方便并且节省空间的,但是对于大部分的非完全二叉树而言,采用顺序存储将导致空间浪费严重且结构混乱、效率低下。

因此,更多的时候,大家都更愿意用链式存储结构来表示二叉树,这样结构更加清晰,尤其是对于一种二叉树非递归遍历算法的C语言实现由写论文的好帮手.zbjy.提供,.左右子树的描述和双亲节点的描述更加方便。

该文中拟采用链式结构来表示二叉树。

用链式存储结构来表示二叉树,一个结点至少由3个域组成,即数据域、左子结点域和右子结点域(如图1所示)。

3 二叉树的遍历及递归算法实现3.1 二叉树的遍历二叉树的遍历就是一个不漏的访问树中的每个结点,同时也不能重复。

所谓“访问”,就是指对结点的数据域进行某种操作,比如说读取、删除、更新、求该节点深度等等。

对于二叉树中的任意一个部分,都可以把它看作三部分,根节点、左子树、右子树,我们用D表示访问跟结点,用L表示遍历左子树,用R表示遍历右子树,则共有以下6种遍历方式[1]。

用C语言编写二叉树的建立与遍历

用C语言编写二叉树的建立与遍历

用C语言编写二叉树的建立与遍历1.对题目要有需求分析在需求分析中,将题目中要求的功能进行叙述分析,并且设计解决此问题的数据存储结构,设计或叙述解决此问题的算法。

给出实现功能的一组或多组测试数据,程序调试后,将按照此测试数据进行测试的结果列出来。

如果程序不能正常运行,写出实现此算法中遇到的问题和改进方法;2.对题目要有相应的源程序源程序要按照写程序的规则来编写。

要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。

(注释量占总代码的四分之一)程序能够运行,要有基本的容错功能。

尽量避免出现操作错误时出现死循环;3.最后提供的主程序可以象一个应用系统一样有主窗口,通过主菜单和分级菜单调用课程设计中要求完成的各个功能模块,调用后可以返回到主菜单,继续选择其他功能进行其他功能的选择。

二叉树的建立与遍历[问题描述]建立一棵二叉树,并对其进行遍历(先序、中序、后序),打印输出遍历结果。

[基本要求]从键盘接受输入,以二叉链表作为存储结构,建立二叉树,并对其进行遍历(先序、中序、后序),将遍历结果打印输出。

以下是我的数据结构实验的作业:肯定好用,里面还包括了统计树的深度和叶子数!记住每次做完一个遍历还要重新输入你的树哦!#include "stdio.h"#include "string.h"#define NULL 0typedef struct BiTNode{char data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;BiTree Create(BiTree T){char ch;ch=getchar();if(ch=='#')T=NULL;else{if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))printf("Error!");T->data=ch;T->lchild=Create(T->lchild);T->rchild=Create(T->rchild); }return T;}void Preorder(BiTree T){if(T){printf("%c",T->data); Preorder(T->lchild); Preorder(T->rchild);}}int Sumleaf(BiTree T){int sum=0,m,n;if(T){if((!T->lchild)&&(!T->rchild)) sum++;m=Sumleaf(T->lchild);sum+=m;n=Sumleaf(T->rchild);sum+=n;}return sum;}void zhongxu(BiTree T){if(T){zhongxu(T->lchild);printf("%c",T->data); zhongxu(T->rchild);}}void houxu(BiTree T){if(T){houxu(T->lchild);houxu(T->rchild);printf("%c",T->data);}}int Depth(BiTree T){int dep=0,depl,depr;if(!T) dep=0;else{depl=Depth(T->lchild);depr=Depth(T->rchild);dep=1+(depl>depr?depl:depr);}return dep;}main(){BiTree T;int sum,dep;T=Create(T);Preorder(T);printf("\n");zhongxu(T);printf("\n");houxu(T);printf("\n");sum=Sumleaf(T);printf("%d",sum);dep=Depth(T);printf("\n%d",dep);}在Turbo C的环境下,先按Ctrl+F9运行程序,此时就是建立二叉树的过程,例如输入序列ABC##DE#G##F###(其中的“#”表示空,并且输入过程中不要加回车,因为回车也有对应的ASCII码,是要算字符的,但是输入完之后可以按回车退出),然后再按ALT+F5显示用户界面,这时候就能够看到结果了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<stdio.h>#include<stdlib.h>typedef struct bitnode{char data;struct bitnode *lchild;struct bitnode *rchild;}bitnode,*bitree;bitree createbitree(bitree &T){char ch;printf("输入结点值ch=");scanf("%c",&ch);scanf("%c",&ch);if(ch!='#'){if(!(T=(bitnode*)malloc(sizeof(bitnode)))) return 0;T->data=ch;T->lchild=NULL;T->rchild=NULL;createbitree(T->lchild);createbitree(T->rchild);}return T;}void preorder(bitree &p){if(p){printf("%c",p->data);if(p->lchild!=NULL)preorder(p->lchild);if(p->rchild!=NULL)preorder(p->rchild);}else printf("NULL");}void inorder(bitree &p){if(p){if(p->lchild!=NULL)inorder(p->lchild);printf("%c",p->data);if(p->rchild!=NULL)inorder(p->rchild);}}void postorder(bitree &p){if(p){if(p->lchild!=NULL)postorder(p->lchild);if(p->rchild!=NULL)postorder(p->rchild);printf("%c",p->data);}}int number(bitree &bt){int n1,n2;if(!bt)return 0;if(!bt->lchild&&!bt->rchild) return 1;n1=number(bt->lchild);n2=number(bt->rchild);return(n1+n2+1);}int leafs(bitree &bt){int n1,n2;if(!bt) return 0;if(!bt->lchild&&!bt->rchild) return 1;n1=leafs(bt->lchild);n2=leafs(bt->rchild);return n1+n2;}int height(bitree &bt){int h1,h2;if(!bt) return 0;h1=height(bt->lchild);h2=height(bt->rchild);return 1+(h1>h2 ? h1:h2);}void copytree(bitree &T,bitree &s){if(!T) s=NULL;else{s=(bitnode*)malloc(sizeof(bitnode));if(T->lchild!=NULL)copytree(T->lchild,s->lchild);else s->lchild=NULL;if(T->rchild!=NULL)copytree(T->rchild,s->rchild);else s->rchild=NULL;s->data=T->data;}}int Calculate(BiTree T)//计算表达式二叉树的值{ //后序遍历实现int nl,nr;if(!T->lchild&&!T->rchild) return T->data;if(!T->lchild->lchild&&!T->lchild->rchild) return T->lchild->data;nl=Calculate(T->lchild);if(!T->rchild->lchild&&!T->rchild->rchild) return T->rchild->data;nr=Calculate(T->rchild);switch(T->data){case '+': return (nl-48)+(nr-48);case '-': return (nl-48)-(nr-48);case '*': return (nl-48)*(nr-48);case '/': return (nl-48)/(nr-48);}}void deletetree(bitree &bt){if(!bt) return;bitnode *p;p=bt;if(p->lchild)deletetree(p->lchild);if(p->rchild)deletetree(p->rchild);free(p);bt=NULL;}bitree exchangetree(bitree &bt){bitnode *t,*t1,*t2;if(!bt) t=NULL;else{t=(bitnode *)malloc(sizeof(bitree));t->data=bt->data;t1=exchangetree(bt->lchild);t2=exchangetree(bt->rchild);t->lchild=t2;t->rchild=t1;}return t;}#define N 10void main(){bitree p[N]={NULL};int i,j,menu;while(1){printf("\n");printf(" 1--creat\n");printf(" 3--preorder\n");printf(" 4--inorder\n");printf(" 5--postorder\n");printf(" 6--copy\n");printf(" 7--number\n");printf(" 8--leafs\n");printf(" 9--height\n");printf(" 10--deleate\n");printf(" 11--qiuzhi\n");printf(" 12--exchange\n");printf("\n please chose:");scanf("%d",&menu);switch(menu){case 0:return;case 1:printf("\n输入新建二叉树下标(0--%d)\n",N-1);scanf("%d",&i);p[i]=createbitree(p[i]);break;case 3:printf("输入要前序遍历的二叉树下标(0--%d)\n",N-1);scanf("%d",&i);preorder(p[i]);break;case 4:printf("输入要中序遍历的二叉树下标(0--%d)\n",N-1);scanf("%d",&i);inorder(p[i]);break;case 5:printf("输入要后序遍历的二叉树下标(0--%d)\n",N-1);scanf("%d",&i);postorder(p[i]);break;case 6:printf("输入要复制的二叉树下标和复制后的二叉树下标(0--%d)\n",N-1);scanf("%d%d",&i,&j);copytree(p[i],p[j]);break;case 7:int x;printf("输入要统计的二叉树节点的下标(0--%d)\n",N-1);scanf("%d",&i);x=number(p[i]);printf("%d",x);break;case 8:int y;printf("输入要统计的二叉树叶子树的下标(0--%d)\n",N-1);scanf("%d",&i);y=leafs(p[i]);printf("%d",y);break;case 9:int z;printf("输入要计算的二叉树高度的下标(0--%d)\n",N-1);scanf("%d",&i);z=height(p[i]);printf("%d",z);break;case 10:printf("输入要删除的二叉树的下标(0--%d)\n",N-1);scanf("%d",&i);deletetree(p[i]);break;case 11:int j;printf("输入要求值的二叉树的下标(0--%d)\n",N-1);scanf("%d",&i);j=Calculate(bt);printf("结果=%d\n",j);break;case 12:printf("输入要交换子树的二叉树下标(0--%d)\n",N-1);scanf("%d",&i);p[i]=exchangetree(p[i]);break;}}}。

相关文档
最新文档