二叉樹基本操作程式碼實現
阿新 • • 發佈:2022-12-05
#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