二叉树基本操作代码实现
#include <stdio.h> #include <stdlib.h> //exit #include<malloc.h> //定义二叉链表结点结构 typedef struct node{ int data; struct node *lchild, *rchild; }BiTree; //创建二叉链表 BiTree *CreateBiTree( ) { BiTree *T; int x; scanf("%d",&x); if(x==0) T=NULL; else { if(!(T=(BiTree*)malloc(sizeof(BiTree)))) exit(-1); T->data = x; T->lchild =CreateBiTree(); T->rchild =CreateBiTree(); } return T; } //先序遍历二叉树 void Preorder(BiTree *T ) { if(T) { printf("%d",T->data); Preorder( T->lchild ); Preorder( T->rchild ); } } //中序遍历二叉树 void Inorder(BiTree *T ) { if(T) { Inorder( T->lchild ); printf("%d",T->data); Inorder( T->rchild ); } } //后序遍历二叉树 void Postorder(BiTree *T ) { if(T) { Postorder( T->lchild ); Postorder( T->rchild ); printf("%d",T->data); } } //计算二叉树的深度 int Depth(BiTree *T) { int depl,depr; if(T) { depl=Depth(T->lchild); depr=Depth(T->rchild); if (depl>=depr) return (depl+1); else return (depr+1); } else return 0; } //求二叉树结点的个数 int Total(BiTree *T) { int left,right; if (T==NULL) return 0; left= Total(T->lchild); right= Total(T->rchild); return 1+left+right; } //求结点的双亲结点 int Parent(BiTree *T,int x) { //若返回值为0,则结点不在树中 //若返回值为1,则找到双亲结点 if(T) { if(T->data ==x) { printf("该结点为树跟,不存在双亲"); return 0; } else if(T->lchild&&T->lchild->data==x||T->rchild&&T->rchild->data==x) { printf("该结点为的双亲%d",T->data); return 1; } else { if(Parent(T->lchild, x)) return 1; else return Parent(T->rchild, x); } } else return 0; } //判定结点所在的层次 int Level(BiTree *T,int x,int n) {//若返回值为0,则结点不在树中,否则返回结点的层次 int lev; if(T) { if(T->data==x) return n; lev=Level(T->lchild,x,n+1); if(lev) return lev; else return Level(T->rchild,x,n+1); } else return 0; } void freeTree(BiTree *T) { BiTree *ltree,*rtree; if(T) { ltree=T->lchild; rtree=T->rchild; free(T); freeTree(ltree); freeTree(rtree); } } void main() { int sel; BiTree *T; int x; do{ printf("┌─────────────────┐\n"); printf("︳ 二叉树的基本操作(二叉链表实现) ︳\n"); printf("︳ ︳\n"); printf("︳ 1 创建 2、先序遍历 ︳\n"); printf("︳ 3、中序遍历 4、后序遍历 ︳\n"); printf("︳ 5、深度 6、结点个数 ︳\n"); printf("︳ 7、求双亲 8、结点层次 ︳\n"); printf("︳ 9、退出 ︳\n"); printf("└─────────────────┘\n"); printf("请选择:"); scanf("%d",&sel); switch(sel) { case 1: printf("\n请输入二叉树中的结点:\n"); T=CreateBiTree(); break; case 2: printf("\n先序遍历序列:\n"); Preorder(T ); break; case 3: printf("\n中序遍历序列:\n"); Inorder(T ); break; case 4: printf("\n后序遍历序列:\n"); Postorder(T ); break; case 5: printf("\n二叉树的深度为:%d\n",Depth(T)); break; case 6: printf("\n二叉树中结点总数为:%d\n",Total(T)); break; case 7: printf("\n请输入一个结点:\n"); scanf("%d",&x); if(!Parent(T,x)) printf("\n未找到双亲"); break; case 8: printf("\n请输入一个结点:\n"); scanf("%d",&x); printf("\n该结点层次为:%d\n",Level(T,x,1)); break; case 9: freeTree(T); return; } printf("\n按任意键继续....\n"); getch(); system("cls"); }while(1); //释放链表 } //测试数据: //1 2 3 0 0 4 5 0 6 0 0 7 0 0 0
本文作者:Little_Monster-lhq
本文链接:https://www.cnblogs.com/little-monster-lhq/p/16951677.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南