二叉树的各种操作

来源:互联网 发布:js md5 加盐 编辑:程序博客网 时间:2024/06/08 02:49
定义二叉树节点;实现二叉树的生成、遍历(前序,中序和后序)、查询二叉树中某个节点、统计二叉树节点个数、统计二叉树叶子节点个数、求二叉树的深度、复制二叉树等函数。
#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct BitNode{int data;//数据域struct BitNode *lchild, *rchild;//左右孩子指针}BitNode, *BiTree;BitNode*Init_BTNode()//初始化二叉树{int a;BitNode*T;T = (BitNode*)malloc(sizeof(BitNode));printf("输入根节点:(0表示空树)\n");scanf("%d", &a);//输入0表示空树if (a == 0){printf("这是空树!");system("pause");exit(0);}T->data = a;T->lchild = NULL;//左子树节点T->rchild = NULL;//右子树节点return T;}int createBiTree(BitNode*bt)//树的生成{int a;BitNode*Node;printf("请输入%d节点的左孩子(0为空)\n", bt->data);scanf("%d",&a);if (a != 0)//递归法为树添加元素{Node = (BitNode*)malloc(sizeof(BitNode));Node->data = a;Node->lchild = NULL;Node->rchild = NULL;bt->lchild = Node;createBiTree(bt->lchild);}printf("请输入%d节点的右孩子(0为空)\n", bt->data);//输入右子树scanf("%d", &a);if (a != 0){Node = (BiTree)malloc(sizeof(BitNode));Node->data = a;Node->lchild = NULL;Node->rchild = NULL;bt->rchild = Node;createBiTree(bt->rchild);}return 0;}void visit(BiTree T){printf("%d ", T->data);}void PreOrder(BitNode*T)//前序遍历{BitNode*temp = T;if (temp!= NULL){visit(temp);PreOrder(temp->lchild);//遍历左子树PreOrder(temp->rchild);//遍历右子树}}void InOrder(BitNode*T)//中序遍历{BitNode*temp = T;if (temp != NULL) {InOrder(temp->lchild);visit(temp);InOrder(temp->rchild);}}void PostOrder(BitNode*T) {BitNode*temp = T;if (temp != NULL) {PostOrder(temp->lchild);PostOrder(temp->rchild);visit(temp);}}bool IsFind(BiTree T, int find) {//判断某个结点是否在树中if (T == NULL)return false;if (T->data == find)return true;if (IsFind(T->lchild, find))return true;return IsFind(T->rchild, find);}int sumNodeTree(BiTree T)//统计二叉树中结点的个数{BitNode*temp = T;int sum = 0;if (temp == NULL)return 0;else {sum = 1 + sumNodeTree(temp->lchild) + sumNodeTree(temp->rchild);}return sum;}int yeziNodeTree(BiTree T)//求叶子结点的个数{BitNode*temp = T;int sum = 0;if (temp == NULL)return 0;else if (temp->lchild == NULL&&temp->rchild == NULL)return 1;elsesum = yeziNodeTree(temp->lchild) + yeziNodeTree(temp->rchild);return sum;}int treeDeep(BiTree T)//树的深度{BitNode*temp = T;int deep = 0;if (temp) {int leftDeep = treeDeep(temp->lchild);int rightDeep = treeDeep(temp->rchild);deep = leftDeep >= rightDeep ? leftDeep + 1 : rightDeep + 1;}return deep;}BiTree copyTree(BiTree T)//复制二叉树{BiTree newnode;if (!T) return NULL;else {newnode = (BiTree)malloc(sizeof(BitNode));newnode->data = T->data;newnode->lchild = copyTree(T->lchild);newnode->rchild = copyTree(T->rchild);return newnode;}}void menu(){system("cls");printf("-----------------------------学生管理系统--------------------------------\n");printf("\n\t1.前序遍历    2.中序遍历    3.后序遍历\n");printf("\t4.查询结点    5.统计结点    6.叶子结点\n");printf("\t7.二叉深度    8.复制二叉    0.结束操作\n");printf("\n-------------------------------------------------------------------------\n");printf("\n请选择操作(0-8):\n");}void ShowMenu(BiTree T){BitNode*copy;int find;bool judge;int choose;menu();scanf("%d", &choose);system("cls");switch (choose){case 1:printf("先序遍历得到的节点序列为:\t");PreOrder(T);break;case 2:printf("中序遍历得到的节点序列为:\t");InOrder(T);break;case 3:printf("后序遍历得到的节点序列为:\t");PostOrder(T);break;case 4:printf("请输入你要查询的结点:\t");scanf("%d", &find);judge = IsFind(T, find);if (judge)printf("%d结点在树中.\n", find);elseprintf("%d结点不在树中.\n", find);break;case 5:find = sumNodeTree(T);printf("结点的总个数为:\t%d", find);break;case 6:find = yeziNodeTree(T);printf("叶子结点的个数为:\t%d",find);break;case 7:find = treeDeep(T);printf("二叉树的深度为:\t%d", find);break;case 8:copy = copyTree(T);printf("先序遍历输出copy过得二叉树:\t");PreOrder(copy);break;case 0:exit(0);default :printf("输入错误,按回车继续:");}printf("\n");system("pause");}int main(){BitNode*T;T = Init_BTNode();createBiTree(T);while (1) {ShowMenu(T);}return 0;}

原创粉丝点击