C++创建二叉树及操作
- 格式:doc
- 大小:44.00 KB
- 文档页数:11
题目:二叉排序树的实现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()即为二叉树查询函数。
二叉树的建立与基本操作二叉树是一种特殊的树形结构,它由节点(node)组成,每个节点最多有两个子节点。
二叉树的基本操作包括建立二叉树、遍历二叉树、查找二叉树节点、插入和删除节点等。
本文将详细介绍二叉树的建立和基本操作,并给出相应的代码示例。
一、建立二叉树建立二叉树有多种方法,包括使用数组、链表和前序、中序、后序遍历等。
下面以使用链表的方式来建立二叉树为例。
1.定义二叉树节点类首先,定义一个二叉树节点的类,包含节点值、左子节点和右子节点三个属性。
```pythonclass Node:def __init__(self, value):self.value = valueself.left = Noneself.right = None```2.建立二叉树使用递归的方法来建立二叉树,先构造根节点,然后递归地构造左子树和右子树。
```pythondef build_binary_tree(lst):if not lst: # 如果 lst 为空,则返回 Nonereturn Nonemid = len(lst) // 2 # 取 lst 的中间元素作为根节点的值root = Node(lst[mid])root.left = build_binary_tree(lst[:mid]) # 递归构造左子树root.right = build_binary_tree(lst[mid+1:]) # 递归构造右子树return root```下面是建立二叉树的示例代码:```pythonlst = [1, 2, 3, 4, 5, 6, 7]root = build_binary_tree(lst)```二、遍历二叉树遍历二叉树是指按照其中一规则访问二叉树的所有节点,常见的遍历方式有前序遍历、中序遍历和后序遍历。
1.前序遍历前序遍历是指先访问根节点,然后访问左子节点,最后访问右子节点。
```pythondef pre_order_traversal(root):if root:print(root.value) # 先访问根节点pre_order_traversal(root.left) # 递归访问左子树pre_order_traversal(root.right) # 递归访问右子树```2.中序遍历中序遍历是指先访问左子节点,然后访问根节点,最后访问右子节点。
/*一下总结一些二叉树的常见操作:包括建立二叉树先/中/后序遍历二叉树求二叉树的叶子节点个数求二叉树的单分支节点个数计算二叉树双分支节点个数计算二叉树的高度计算二叉树的所有叶子节点数*/#include<stdio.h> //c语言的头文件#include<stdlib.h>//c语言的头文件stdlib.h千万别写错了#define Maxsize 100/*创建二叉树的节点*/typedef struct BTNode //结构体struct 是关键字不能省略结构体名字可以省略(为无名结构体)//成员类型可以是基本型或者构造形,最后的为结构体变量。
{char data;struct BTNode *lchild,*rchild;}*Bitree;/*使用先序建立二叉树*/Bitree Createtree() //树的建立{char ch;Bitree T;ch=getchar(); //输入一个二叉树数据if(ch==' ') //' '中间有一个空格的。
T=NULL;else{ T=(Bitree)malloc(sizeof(Bitree)); //生成二叉树(分配类型*)malloc(分配元素个数*sizeof(分配类型))T->data=ch;T->lchild=Createtree(); //递归创建左子树T->rchild=Createtree(); //地柜创建右子树}return T;//返回根节点}/*下面先序遍历二叉树*//*void preorder(Bitree T) //先序遍历{if(T){printf("%c-",T->data);preorder(T->lchild);preorder(T->rchild);}} *//*下面先序遍历二叉树非递归算法设计*/void preorder(Bitree T) //先序遍历非递归算法设计{Bitree st[Maxsize];//定义循环队列存放节点的指针Bitree p;int top=-1; //栈置空if(T){top++;st[top]=T; //根节点进栈while(top>-1) //栈不空时循环{p=st[top]; //栈顶指针出栈top--;printf("%c-",p->data );if(p->rchild !=NULL) //右孩子存在进栈{top++;st[top]=p->rchild ;}if(p->lchild !=NULL) //左孩子存在进栈{top++;st[top]=p->lchild ;}}printf("\n");}}/*下面中序遍历二叉树*//*void inorder(Bitree T) //中序遍历{if(T){inorder(T->lchild);printf("%c-",T->data);inorder(T->rchild);}}*//*下面中序遍历二叉树非递归算法设计*/void inorder(Bitree T) //中序遍历{Bitree st[Maxsize]; //定义循环队列,存放节点的指针Bitree p;int top=-1;if(T){p=T;while (top>-1||p!=NULL) //栈不空或者*不空是循环{while(p!=NULL) //扫描*p的所有左孩子并进栈{top++;st[top]=p;p=p->lchild ;}if(top>-1){p=st[top]; //出栈*p节点,它没有右孩子或右孩子已被访问。
C平衡⼆叉树(AVL)创建和删除 AVL是最先发明的⾃平衡⼆叉查找树算法。
在AVL中任何节点的两个⼉⼦⼦树的⾼度最⼤差别为⼀,所以它也被称为⾼度平衡树,n个结点的AVL树最⼤深度约1.44log2n。
查找、插⼊和删除在平均和最坏情况下都是O(log n)。
增加和删除可能需要通过⼀次或多次树旋转来重新平衡这个树。
定义 ⽤LH,EH,RH分别表⽰左⼦树⾼,等⾼,右⼦树⾼,即平衡因⼦1、0、-1#include <stdio.h>#include <stdlib.h>#include <stdbool.h>#define LH 1 // 左⾼#define EH 0 // 等⾼#define RH -1 // 右⾼typedef struct TreeNode{int data;int bf;struct TreeNode *left, *right;}TreeNode; 旋转处理 左旋和右旋,记住“左逆右顺”就可以/************************************************* 对以*p为根的⼆叉排序树作右旋处理,处理之后p指向新的树根结点,* A B* / / \* B 旋转后变为 C A* / \ /* C D D* 即旋转处理之前的左⼦树的结点。
************************************************/void r_rotate(TreeNode **p){TreeNode *l = (*p)->left;(*p)->left = l->right;l->right = (*p);*p = l;}/************************************************* 对以*p为根的⼆叉排序树作左旋处理,处理之后p指向新的树根结点,* A B* \ / \* B 旋转后变为 A D* / \ \* C D C* 即旋转处理之前的右⼦树的结点。
⼆叉树的建⽴⽅法总结之前已经介绍了⼆叉树的四种遍历(如果不熟悉),下⾯介绍⼀些⼆叉树的建⽴⽅式。
⾸先需要明确的是,由于⼆叉树的定义是递归的,所以⽤递归的思想建⽴⼆叉树是很⾃然的想法。
1. 交互式问答⽅式这种⽅式是最直接的⽅式,就是先询问⽤户根节点是谁,然后每次都询问⽤户某个节点的左孩⼦是谁,右孩⼦是谁。
代码如下(其中字符'#'代表空节点):#include <cstdio>#include <cstdlib>using namespace std;typedef struct BTNode *Position;typedef Position BTree;struct BTNode{char data;Position lChild, rChild;};BTree CreateBTree(BTree bt, bool isRoot){char ch;if (isRoot)printf("Root: ");fflush(stdin); /* 清空缓存区 */scanf("%c", &ch);fflush(stdin);if (ch != '#'){isRoot = false;bt = new BTNode;bt->data = ch;bt->lChild = NULL;bt->rChild = NULL;printf("%c's left child is: ", bt->data);bt->lChild = CreateBTree(bt->lChild, isRoot);printf("%c's right child is: ", bt->data);bt->rChild = CreateBTree(bt->rChild, isRoot);}return bt;}int main(){BTree bt;bt = CreateBTree(bt, true);LevelOrderTraversal(bt); /* 层序遍历 */return0;}2. 根据先序序列例如输⼊序列ABDH##I##E##CF#J##G##(#表⽰空),则会建⽴如下图所⽰的⼆叉树思路和第⼀种⽅式很相似,只是代码实现细节有⼀点区别,这⾥给出创建函数BTree CreateBTree(){BTree bt = NULL;char ch;scanf("%c", &ch);if (ch != '#'){bt = new BTNode;bt->data = ch;bt->lChild = CreateBTree();bt->rChild = CreateBTree();}return bt;}3. 根据中序序列和后序序列和⽅式⼆不同的是,这⾥的序列不会给出空节点的表⽰,所以如果只给出先序序列,中序序列,后序序列中的⼀种,不能唯⼀确定⼀棵⼆叉树。
C语⾔实现创建⼆叉树,先序遍历、中序遍历、后序遍历输出# include <stdio.h># include <stdlib.h># include <string.h># include <iostream># define OK 0;# define ERROR -1;typedef int TElemType;typedef char DataType;typedef int Status;typedef struct BiNode {DataType data;//存⾃定义类型的值struct BiNode *lchild, *rchild;//左右⼩孩指针}BiNode,*BiTree;void CreatBiNode(BiNode **Node)//此处应注意传递的参数(⼆重指针){char data;scanf_s("%c", &data);*Node = (BiTree)malloc(sizeof(BiNode));if (data == '#'){*Node = NULL;}else if ((data != '#') && (*Node)){(*Node)->data = data;(*Node)->lchild = NULL;(*Node)->rchild = NULL;CreatBiNode(&(*Node)->lchild);CreatBiNode(&(*Node)->rchild);}}Status PreOrderTraverse(BiTree T) {if (T == NULL) {return OK;}else {printf("%c", T->data);PreOrderTraverse(T->lchild);PreOrderTraverse(T->rchild);}}Status InOrderTraverse(BiTree T) {if (T == NULL) {return OK;}else {InOrderTraverse(T->lchild);printf("%c", T->data);InOrderTraverse(T->rchild);}}Status PostOrderTraverse(BiTree T) {if (T == NULL) {return OK;}else {PostOrderTraverse(T->lchild);PostOrderTraverse(T->rchild);printf("%c", T->data);}}int main(){printf("先序输⼊⼆叉树(空结点⽤'#'表⽰):");BiTree T=NULL;CreatBiNode(&T);printf("先序遍历⼆叉树:");PreOrderTraverse(T);printf("\n中序遍历⼆叉树:");InOrderTraverse(T);printf("\n后序遍历⼆叉树:");PostOrderTraverse(T);system("pause");return 0;}解决思想:⼩⽣⽤的是递归创建⼆叉树,递归遍历⼆叉树,因为使⽤递归会⽐较简洁。
二叉树 c语言在计算机科学领域中,树型数据结构是一种非常重要的数据结构,在实际开发中也得到了广泛的应用。
其中,二叉树又是一种非常常见的树型结构。
二叉树在很多情况下都能够提供更好的算法效率,同时也易于理解和实现,因此我们可以通过通过学习和掌握二叉树的特点以及优点,来更好的应用到实际开发中。
一、二叉树的定义二叉树是一种树型结构,树型结构是由节点构成的。
二叉树与一般的树型结构不同,它的每个节点最多只有两个子节点,分别称为左子树和右子树。
它们可以为空或者不为空,其子节点的数量时不固定且没有任何限制的。
二叉树的定义如下:(1)空树是树的一种特殊的状态。
我们可以把它称为二叉树;(2)若不是空树,那么它就是由一个称为根节点(root)的元素和左右两棵分别称为左子树(left subtree)和右子树(right subtree)的二叉树组成。
二、二叉树的特性(1)每个节点最多只有两个子节点,分别称为左子节点和右子节点;(2)左子树和右子树是二叉树;(3)二叉树没有重复的节点。
三、二叉树的应用二叉树是一种非常实用的数据结构,因为它可以模拟很多实际生活中的情况。
例如,我们可以利用二叉树来对某些数据进行分类和排序。
在二叉树的基础上,我们还可以构造二叉堆、哈夫曼树等更高级的数据结构。
除此之外,二叉树还可以应用到程序设计中。
例如,我们可以构造一个二叉树来表示某个程序的控制流,这个程序在执行时可以沿着二叉树的各个节点进行分支和选择,实现不同的功能。
此外,我们还可以利用二叉树来加快某些算法的执行效率,比如二分查找算法等。
四、二叉树的遍历方式对于二叉树的遍历,有三种基本方式,即前序遍历、中序遍历、后序遍历。
它们的遍历顺序不同,因此也得到了不同的称呼。
下面我们来简要介绍一下这三种遍历方式的特点和应用。
(1)前序遍历前序遍历是指首先访问树的根节点,然后按照从左到右的顺序依次遍历左子树和右子树。
前序遍历的应用非常广泛,可以用于生成表达式树、构造二叉树等等。
C 语⾔数据结构之⼆叉链表创建⼆叉树⽬录⼀、思想(先序思想创建)⼆、创建⼆叉树(1)传⼀级参数⽅法(2)传⼆级参数⽅法⼀、思想(先序思想创建)第⼀步先创建根节点,然后创建根节点左⼦树,开始递归创建左⼦树,直到递归创建到的节点下不继续创建左⼦树,也就是当下递归到的节点下的左⼦树指向NULL ,结束本次左⼦树递归,返回这个节点的上⼀个节点,开始创建右⼦树,然后⼜开始以当下这个节点,继续递归创建左⼦树,左⼦树递归创建完,就递归创建右⼦树,直到递归结束返回到上⼀级指针节点(也就是根节点下),此时根节点左边⼦树创建完毕,开始创建右边⼦树,原理和根节点左边创建左右⼦树相同⼆、创建⼆叉树⼆叉树的操作通常使⽤递归⽅法,如果递归不太明⽩,建议去对此进⾏⼀下学习和练习。
⼆叉树的操作可以分为两类,⼀类是需要改变⼆叉树的结构的,⽐如⼆叉树的创建、节点删除等等,这类操作,传⼊的⼆叉树的节点参数为⼆叉树指针的地址,这种参⼊传⼊,便于更改⼆叉树结构体的指针(即地址)。
这⾥稍微有⼀点点绕,可能需要多思考⼀下如下是⼆叉数创建的函数,这⾥我规定,节点值为整数,如果输⼊的数为-1,则表⽰结束继续往下创建⼦节点的操作。
然后我们使⽤递归的⽅法以此创建左⼦树和右⼦树为了更⽅便的使⽤⼆叉树结构体,可以使⽤ typedef 对结构体进⾏命名123456typedef struct Tree{int data; // 存放数据域struct Tree *lchild; // 遍历左⼦树指针struct Tree *rchild; // 遍历右⼦树指针}Tree,*BitTree;这⾥展⽰两种传参类型的创建⽅法,其中深意可多次参考理解,加深指针理解(1)传⼀级参数⽅法123456789101112131415161718BitTree 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(); // 开始递归创建左⼦树192021222324printf("请输⼊%d 的右⼦树: ",data);T->rchild = CreateLink(); // 开始到上⼀级节点的右边递归创建左右⼦树return T; // 返回根节点 } }(2)传⼆级参数⽅法123456789101112131415161718192021222324252627282930BitTree CreateLink(BitTree *T) // 次数 T 为指向根节点的指针的地址{ int data; scanf("%d",&data); if(data == -1){*T=NULL; // 结束递归时,让指针当前节点的指针地址的 指针 指向NULL}else{*T = (BitTree)malloc(sizeof(Tree)); // 对指向节点指针地址的指针 分配内存 if(!(*T) ){ // *T = NULL 表⽰分配内存失败,也就是结束递归创建了 printf("内存分配失败\n");exit(-1);}(*T)->data = data; // 给节点指针地址内的数据域,存⼊数据 printf("请输⼊%d 的左⼦树: ",data); CreateLink(&(*T)->lchild); // 开始遍历左⼦树printf("请输⼊%d 的右⼦树: ",data);CreateLink(&(*T)->rchild); // 开始遍历右⼦树,遍历的思想⽂章开头处解释} }1234567891011121314#include<stdio.h>#include<stdlib.h> typedef struct Tree{ int data; // 存放数据域 struct Tree *lchild; // 遍历左⼦树指针 struct Tree *rchild; // 遍历右⼦树指针 }Tree,*BitTree;151617181920212223242526272829303132333435363738394041424344454647484950515253545556BitTree 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){return; } printf("%d ",T->data);ShowXianXu(T->lchild); // 递归遍历左⼦树ShowXianXu(T->rchild); // 递归遍历右⼦树} int main(){ BitTree S;printf("请输⼊第⼀个节点的数据:\n");S = CreateLink(); // 接受创建⼆叉树完成的根节点ShowXianXu(S); // 先序遍历⼆叉树 return 0; }123456789101112131415#include<stdio.h>#include<stdlib.h>typedef struct Tree{int data;struct Tree *lchild;struct Tree *rchild;}Tree,*BitTree; BitTree CreateLink(BitTree *T) // 次数 T 为指向根节点的指针的地址{ int data;16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 scanf("%d",&data);if(data == -1){*T=NULL; // 结束递归时,让指针当前节点的指针地址的指针指向NULL }else{*T = (BitTree)malloc(sizeof(Tree)); // 对指向节点指针地址的指针分配内存if(!(*T) ){ // *T = NULL 表⽰分配内存失败,也就是结束递归创建了printf("内存分配失败\n");exit(-1);}(*T)->data = data; // 给节点指针地址内的数据域,存⼊数据printf("请输⼊%d的左⼦树: ",data);CreateLink(&(*T)->lchild); // 开始遍历左⼦树printf("请输⼊%d的右⼦树: ",data);CreateLink(&(*T)->rchild); // 开始遍历右⼦树,遍历的思想⽂章开头处解释}}void ShowXianXu(BitTree T) // 先序遍历⼆叉树{if(T==NULL){return;}printf("%d ",T->data);ShowXianXu(T->lchild); // 遍历左⼦树ShowXianXu(T->rchild); // 遍历右⼦树}int main(){BitTree *S; // 创建指向这个结构体指针地址的指针printf("请输⼊第⼀个节点的数据:\n");CreateLink(&S); // 传⼆级指针地址ShowXianXu(S);return0;}到此这篇关于C语⾔数据结构之⼆叉链表创建⼆叉树的⽂章就介绍到这了,更多相关C语⾔⼆叉链表创建⼆叉树内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
c语言二叉树代码以下是一个简单的C语言二叉树代码,包括二叉树的创建、插入、遍历、删除等操作:```#include<stdio.h>#include<stdlib.h>//定义二叉树节点类型typedef struct node{int data;struct node *left;struct node *right;}Node;//创建二叉树Node* create_tree(){int value;printf('请输入节点的值(-1表示结束):');scanf('%d', &value);if(value == -1){return NULL;}else{Node *p = (Node*)malloc(sizeof(Node));p->data = value;printf('请输入%d的左子节点:', value);p->left = create_tree();printf('请输入%d的右子节点:', value);p->right = create_tree();return p;}}//插入节点Node* insert_node(Node *root, int value){if(root == NULL){Node *p = (Node*)malloc(sizeof(Node));p->data = value;p->left = NULL;p->right = NULL;return p;}else if(value < root->data){root->left = insert_node(root->left, value);}else if(value > root->data){root->right = insert_node(root->right, value); }return root;}//先序遍历void preorder_traversal(Node *root){if(root != NULL){printf('%d ', root->data);preorder_traversal(root->left);preorder_traversal(root->right);}}//中序遍历void inorder_traversal(Node *root){if(root != NULL){inorder_traversal(root->left);printf('%d ', root->data);inorder_traversal(root->right);}}//后序遍历void postorder_traversal(Node *root){if(root != NULL){postorder_traversal(root->left);postorder_traversal(root->right);printf('%d ', root->data);}}//查找节点Node* search_node(Node *root, int value){ if(root == NULL){return NULL;}else if(root->data == value){return root;}else if(value < root->data){return search_node(root->left, value);}else{return search_node(root->right, value); }}//删除节点Node* delete_node(Node *root, int value){if(root == NULL){return NULL;}else if(value < root->data){root->left = delete_node(root->left, value); }else if(value > root->data){root->right = delete_node(root->right, value); }else{//情况一:被删除节点没有子节点if(root->left == NULL && root->right == NULL){ free(root);root = NULL;}//情况二:被删除节点只有一个子节点else if(root->left == NULL){Node *temp = root;root = root->right;free(temp);}else if(root->right == NULL){Node *temp = root;root = root->left;free(temp);}//情况三:被删除节点有两个子节点else{Node *temp = root->right;while(temp->left != NULL){temp = temp->left;}root->data = temp->data;root->right = delete_node(root->right, temp->data); }}return root;}//主函数int main(){Node *root = NULL;int choice, value;while(1){printf('请选择操作: ');printf('1.创建二叉树 ');printf('2.插入节点');printf('3.遍历二叉树 ');printf('4.查找节点');printf('5.删除节点');printf('6.退出程序');scanf('%d', &choice); switch(choice){case 1:root = create_tree(); break;case 2:printf('请输入要插入的节点值:');scanf('%d', &value);root = insert_node(root, value);break;case 3:printf('先序遍历:');preorder_traversal(root);printf('中序遍历:');inorder_traversal(root);printf('后序遍历:');postorder_traversal(root);printf('');break;case 4:printf('请输入要查找的节点值:');scanf('%d', &value);Node *result = search_node(root, value);if(result != NULL){printf('找到节点:%d', result->data);}else{printf('未找到节点:%d', value);}break;case 5:printf('请输入要删除的节点值:');scanf('%d', &value);root = delete_node(root, value); break;case 6:printf('程序已退出。
以下是一个简单的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语言二叉树的建立,撤销与遍历二叉树是一种特殊的树,每个节点只能有最多二个孩子节点,或者没有孩子节点。
建立,与撤销或遍历二叉树主要是靠递归的方法。
#include<stdio.h>#include<stdlib.h>typedef struct stud/*定义二叉树的结构,只有一个数据项,和两个孩子节点*/{char data;struct stud *left;struct stud *right;} bitree;void destroy(bitree **root)/*撤销二叉树,这里用的是递归和二级指针*/ {if(*root!=NULL&&(*root)->left!=NULL)/*当前结点与左子树不空,递归撤销左子树*/destroy(&(*root)->left);if(*root!=NULL&&(*root)->right!=NULL)/*当前结点与右子树不空,递归撤销右子树*/destroy(&(*root)->right);free(*root);/*左右子树都为空,撤销该节点,并递归撤销其上的所有节点*/ }void inititate(bitree **root)/*初始化二叉树的头结点,并分配空间*/ {*root=(bitree *)malloc(sizeof(bitree ));(*root)->left=NULL;(*root)->right=NULL;}bitree *insert_left(bitree *curr,char x)/*在左子树插入数据*/{bitree *s,*t;if(curr==NULL)return NULL;t=curr->left;/*保存当前左子树的数据*/s=(bitree *)malloc(sizeof(bitree));s->data=x;s->left=t;/*新结点指向原来的左子树*/s->right=NULL;curr->left=s;/*原来的节点指向新结点*/return curr->left;}bitree *insert_right(bitree *curr,char x)/*在这个节点的右子树插入数据*/{bitree *s,*t;if(curr==NULL)return NULL;t=curr->right;s=(bitree *)malloc(sizeof(bitree));s->data=x;s->left=NULL;s->right=t;curr->right=s;return curr->right;}bitree *delete_left(bitree *curr)/*删除当前结点的左子树*/{if(curr!=NULL&&curr->left!=NULL)destroy(&curr->left);/*删除左子树本身及其以后的所有节点*/curr->left=NULL;return curr;}bitree *delete_right(bitree *curr)/*删除右子树*/{if(curr!=NULL&&curr->right!=NULL)destroy(&curr->right);curr->right=NULL;return curr;}void preorder(bitree *root)/*递归先序遍历根节点*/ {if(root!=NULL){printf("%c ",root->data);preorder( root->left);preorder( root->right);}}void midorder(bitree *root)/*递归中序遍历根节点*/ {if(root!=NULL){midorder( root->left);printf("%c ",root->data);midorder(root->right);}}void postorder(bitree *root))/*递归后序遍历根节点*/ {if(root!=NULL){postorder(root->left);postorder( root->right);printf("%c ",root->data);}}bitree *search(bitree *root,char x))/*递归某一数值*/ {bitree *find=NULL;if(root!=NULL){if(root->data==x)find=root;else{find=search (root->left,x);)/*在左子树查找*/ if(find==NULL))/*左子树没有找到的话*/find=search (root->right,x);/*右子树找*/}}return find;}void main(){bitree *root,*s,*p,*find;int i,j,k;char c='E';inititate(&root);p=insert_left(root,'A');p=insert_left(p,'B');p=insert_left(p,'D');p=insert_right(p,'G');p=insert_right(root->left,'C');insert_left(p,'E');insert_right(p,'F');printf("前序遍历为\n");preorder(root->left);printf("\n中序遍历为\n");midorder(root->left);printf("\n后序遍历为\n");postorder(root->left);find=search(root->left,c);if(find)printf("这个元素%c在二叉树中\n",c);elseprintf("这个元素%c不在二叉树中\n",c);printf("撤销根节点的左子树为\n");delete_left(root->left);printf("\n前序遍历为\n");preorder(root->left);printf("\n中序遍历为\n");midorder(root->left);printf("\n后序遍历为\n");postorder(root->left);printf("\n撤销根节点的右子树为\n"); delete_right(root->left);printf("前序遍历为\n");preorder(root->left);printf("\n中序遍历为\n");midorder(root->left);printf("\n后序遍历为\n");postorder(root->left);destroy(&root);}。
c语言二叉树代码对于c语言的二叉树代码,我们可以先了解一下二叉树的性质。
二叉树是一种树形结构,每个节点最多有两个子节点。
根据二叉树的性质,我们可以定义一个结构体来表示二叉树的节点。
struct TreeNode {int val; // 节点的值struct TreeNode *left; // 左子节点struct TreeNode *right; // 右子节点};接下来就是实现二叉树的增删改查:1. 增加节点void addNode(struct TreeNode **node, int val) {if (*node == NULL) {struct TreeNode *newNode = (structTreeNode*)malloc(sizeof(struct TreeNode));newNode->val = val;newNode->left = NULL;newNode->right = NULL;*node = newNode;} else {if (val < (*node)->val) {addNode(&((*node)->left), val);} else {addNode(&((*node)->right), val);}}}2. 删除节点void deleteNode(struct TreeNode **node, int val) {if (*node == NULL) {return;}if ((*node)->val == val) {if ((*node)->left != NULL && (*node)->right != NULL) { struct TreeNode *minNode = (*node)->right;while (minNode->left != NULL) {minNode = minNode->left;}(*node)->val = minNode->val;deleteNode(&((*node)->right), minNode->val);} else {struct TreeNode *temp = *node;if ((*node)->left != NULL) {*node = (*node)->left;} else {*node = (*node)->right;}free(temp);}} else if (val < (*node)->val) {deleteNode(&((*node)->left), val);} else {deleteNode(&((*node)->right), val);}}3. 查找节点struct TreeNode* searchNode(struct TreeNode* node, int val) { if (node == NULL) {return NULL;}if (node->val == val) {return node;} else if (val < node->val) {return searchNode(node->left, val);} else {return searchNode(node->right, val);}}以上就是c语言实现二叉树的基本代码。
c++实现树(⼆叉树)的建⽴和遍历算法(⼀)(前序,中序,后序)最近学习树的概念,有关⼆叉树的实现算法记录下来。
不过学习之前要了解的预备知识:树的概念;⼆叉树的存储结构;⼆叉树的遍历⽅法。
⼆叉树的存储结构主要了解⼆叉链表结构,也就是⼀个数据域,两个指针域,(分别为指向左右孩⼦的指针),从下⾯程序1,⼆叉树的存储结构可以看出。
⼆叉树的遍历⽅法:主要有前序遍历,中序遍历,后序遍历,层序遍历。
(层序遍历下⼀篇再讲,本篇主要讲的递归法)下篇主要是,之后会有c++模板实现和。
如这样⼀个⼆叉树:它的前序遍历顺序为:ABDGHCEIF(规则是先是根结点,再前序遍历左⼦树,再前序遍历右⼦树)它的中序遍历顺序为:GDHBAEICF(规则是先中序遍历左⼦树,再是根结点,再是中序遍历右⼦树)它的后序遍历顺序为:GHDBIEFCA(规则是先后序遍历左⼦树,再是后序遍历右⼦树,再是根结点)如果不懂的话,可以参看有关数据结构的书籍。
1,⼆叉树的存储结构(⼆叉链表)//⼆叉树的⼆叉链表结构,也就是⼆叉树的存储结构,1个数据域,2个指针域(分别指向左右孩⼦)typedef struct BiTNode{ElemType data;struct BiTNode *lchild, *rchild;}BiTNode, *BiTree;2,⾸先要建⽴⼀个⼆叉树,建⽴⼆叉树必须要了解⼆叉树的遍历⽅法。
//⼆叉树的建⽴,按前序遍历的⽅式建⽴⼆叉树,当然也可以以中序或后序的⽅式建⽴⼆叉树void CreateBiTree(BiTree *T){ElemType ch;cin >> ch;if (ch == '#')*T = NULL; //保证是叶结点else{*T = (BiTree)malloc(sizeof(BiTNode));//if (!*T)//exit(OVERFLOW); //内存分配失败则退出。
二叉树的建立和遍历实验报告一、引言(100字)二叉树是一种常见的数据结构,它由根节点、左子树和右子树组成,具有递归性质。
本次实验的目的是了解二叉树的建立过程和遍历算法,以及熟悉二叉树的相关操作。
本实验采用C语言进行编写。
二、实验内容(200字)1.二叉树的建立:通过输入节点的值,逐个建立二叉树的节点,并通过指针连接起来。
2.二叉树的遍历:实现二叉树的三种常用遍历算法,即前序遍历、中序遍历和后序遍历。
三、实验过程(400字)1.二叉树的建立:首先,定义二叉树的节点结构,包含节点值和指向左右子树的指针;然后,通过递归的方式,依次输入节点的值,创建二叉树节点,建立好节点之间的连接。
2.二叉树的前序遍历:定义一个函数,实现前序遍历的递归算法,先输出当前节点的值,再递归遍历左子树和右子树。
3.二叉树的中序遍历:同样,定义一个函数,实现中序遍历的递归算法,先递归遍历左子树,再输出当前节点的值,最后递归遍历右子树。
4.二叉树的后序遍历:同样,定义一个函数,实现后序遍历的递归算法,先递归遍历左子树和右子树,再输出当前节点的值。
四、实验结果(300字)通过实验,我成功建立了一个二叉树,并实现了三种遍历算法。
对于建立二叉树来说,只要按照递归的思路,先输入根节点的值,再分别输入左子树和右子树的值,即可依次建立好节点之间的连接。
建立好二叉树后,即可进行遍历操作。
在进行遍历算法的实现时,我首先定义了一个函数来进行递归遍历操作。
在每一次递归调用中,我首先判断当前节点是否为空,若为空则直接返回;若不为空,则按照特定的顺序进行遍历操作。
在前序遍历中,我先输出当前节点的值,再递归遍历左子树和右子树;在中序遍历中,我先递归遍历左子树,再输出当前节点的值,最后递归遍历右子树;在后序遍历中,我先递归遍历左子树和右子树,再输出当前节点的值。
通过运行程序,我成功进行了二叉树的建立和遍历,并得到了正确的结果。
可以看到,通过不同的遍历顺序,可以获得不同的遍历结果,这也是二叉树遍历算法的特性所在。
用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显示用户界面,这时候就能够看到结果了。
c语言实现二叉树各种基本运算的算法二叉树是一种常见的数据结构,可以应用于许多算法和问题中。
在C语言中,我们可以使用指针和结构体来实现二叉树的各种基本运算。
本文将详细介绍二叉树的创建、插入、删除、查找以及遍历等基本操作的算法。
1.创建二叉树创建二叉树可以通过递归的方式来实现。
首先定义一个表示二叉树节点的结构体,包含一个值和左右子节点指针。
然后,通过递归地创建左右子树来构建整个二叉树。
```ctypedef struct TreeNode {int data;struct TreeNode* left;struct TreeNode* right;} TreeNode;//创建二叉树TreeNode* createBinaryTree() {int data;scanf("%d", &data);if (data == -1) { // -1表示空节点return NULL;}TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode)); node->data = data;node->left = createBinaryTree();node->right = createBinaryTree();return node;}```2.插入节点在二叉树中插入节点可以按照二叉搜索树的性质进行。
如果要插入的值小于当前节点的值,则将其插入到左子树中,否则插入到右子树中。
如果子树为空,则直接创建一个新节点作为子树。
```c//插入节点TreeNode* insertNode(TreeNode* root, int data) {if (root == NULL) {TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));newNode->data = data;newNode->left = NULL;newNode->right = NULL;return newNode;}if (data < root->data) {root->left = insertNode(root->left, data);} else {root->right = insertNode(root->right, data);}return root;}```3.删除节点删除二叉树中的节点可以分为三种情况:删除叶子节点、删除只有一个子节点的节点、删除有两个子节点的节点。
BiTree.h文件
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char ElemType;
const int MaxLength=30;//结点个数不超过30个
typedef struct BiTreeNode{
ElemType data;
struct BiTreeNode *lchild,*rchild;
}BiTreeNode,*BiTree;
void CreateBiTree(BiTree &T)
{
ElemType ch;
cin>>ch;
if(ch=='#')
T = NULL;
else
{
if (!(T = new BiTreeNode))
exit(OVERFLOW);
T->data = ch; // 生成根结点
CreateBiTree(T->lchild); // 构造左子树
CreateBiTree(T->rchild); // 构造右子树
}
} // CreateBiTree
void PreOrder(BiTree &T)//递归函数:先序遍历以T为根的二叉树。
{
if(T !=NULL) //递归结束条件
{
cout<<T->data<<" ";//访问根结点
PreOrder(T->lchild); //先序遍历根的左子树
PreOrder(T->rchild); //先序遍历根的右子树}
}
void InOrder(BiTree &T)//递归函数:中序次序遍历以T为根的子树。
{
if(T !=NULL) //NULL是递归终止条件
{
InOrder(T->lchild); //中序遍历根的左子树
cout<<T->data<<" "; //访问根结点
InOrder(T->rchild); //中序遍历根的右子树}
}
void PostOrder(BiTree &T)//递归函数:后序次序遍历以T为根的子树。
{
if(T !=NULL) //NULL是递归终止条件
{
PostOrder(T->lchild); //后序遍历根的左子树
PostOrder(T->rchild); //后序遍历根的右子树
cout<<T->data<<" "; //访问根结点
}
}
void LevelOrder(BiTree T)//层序遍历{
BiTree Q[MaxLength];
int front=0,rear=0;
BiTree p;
if(T)//根结点入队
{
Q[rear]=T;
rear=(rear+1)%MaxLength;
}
while(front!=rear)
{
p=Q[front]; //队头元素出队
front=(front+1)%MaxLength;
cout<<p->data<<" ";
if(p->lchild)//左孩子不为空,入队
{
Q[rear]=p->lchild;
rear=(rear+1)%MaxLength;
}
if(p->rchild)//右孩子不为空,入队
{
Q[rear]=p->rchild;
rear=(rear+1)%MaxLength;
}
}
}
bool Complete(BiTree T)
{
BiTree Q[MaxLength];
int front=0,rear=0;
BiTree p;
if(T==NULL)//根结点入队
{
return true;
}
else
{
Q[rear]=T;
rear=(rear+1)%MaxLength; while(front!=rear)
{
p=Q[front]; //队头元素出队
front=(front+1)%MaxLength;
if(p)
{
Q[rear]=p->lchild;
rear=(rear+1)%MaxLength;
Q[rear]=p->rchild;
rear=(rear+1)%MaxLength;
}
else
{
while(front!=rear)
{
p=Q[front];
if(p)
{
return false;
}
else
{
return true;
}
}
}
}
return true;
}
}
int Depth(BiTree T)
{
int depthval,depthleft,depthright;
if(!T)
{
depthval=0;
}
else
{
depthleft = Depth(T->lchild);
depthright = Depth(T->rchild);
depthval = 1 +(depthleft>depthright ? depthleft:depthright);
}
return depthval;
}
int Countleaf(BiTree T)
{
int m,n;
if(!T)
{
return 0;
}
if(!T->lchild && !T->rchild)
{
return 1;
}
else
{
m = Countleaf(T->lchild);
n = Countleaf(T->rchild);
return (m+n);
}
}
int Countleafs(BiTree T)
{
int m,n;
if(!T)
{
return 0;
}
if(!T->lchild && !T->rchild)
{
return 1;
}
else
{
m = Countleafs(T->lchild);
n = Countleafs(T->rchild);
return (m+n+1);
}
}
BiTree.cpp文件
#include "BiTree.h"
void main()
{
cout<<"Made by Fly!!~~"<<endl;
cout<<"请输入二叉树序列,如:AB#C##D##"<<endl;
BiTree tree;
CreateBiTree(tree);
cout<<"二叉树创建完成!~~"<<endl;
cout<<"先序遍历二叉树输出结果:";
PreOrder(tree);
cout<<endl;
cout<<"中序遍历二叉树输出结果:";
InOrder(tree);
cout<<endl;
cout<<"后序遍历二叉树输出结果:";
PostOrder(tree);
cout<<endl;
cout<<"层次遍历二叉树输出结果:";
LevelOrder(tree);
cout<<endl;
cout<<"层次遍历二叉树判定是否为完全二叉树:"<<endl;
bool t = Complete(tree);
if(t)
{
cout<<"此二叉树是完全二叉树。
"<<endl;
}
else
{
cout<<"此二叉树不是完全二叉树。
"<<endl;
}
cout<<"此二叉树的深度为:";
int m=Depth(tree);
cout<<m<<endl;
cout<<"此二叉树的总结点个数为:";
int n=Countleafs(tree);
cout<<n<<endl;
cout<<"此二叉树的叶子结点个数为:";
int a=Countleaf(tree);
cout<<a<<endl;
}。