1. 程式人生 > >資料結構二叉樹的實現(#表示空結點)

資料結構二叉樹的實現(#表示空結點)

參考老師給的程式碼重新進行對二叉樹的實現與操作(畢竟是老師出題,風格要跟他來)

這一次的二叉樹是通過結點進行構建。
首先初始化二叉樹,就是將根節點開闢一個結點空間,進行初始化。
然後按照先序序列建立二叉樹則是通過遞迴左右子樹進行構建,輸入如果是 ‘#’,則表示為空結點,這樣輸入序列如果是 ab#c###,則表示為如下的二叉樹

        a
      b
        c

遍歷二叉樹就是通過遞迴方式進行先序遍歷。
求二叉樹的高度和結點數也是通過遞迴求解。

/*
   BinTree Implementation
   Author:zzj
   Date:17-6-16
*/
#include<cstdio> #include<cstdlib> #include<algorithm> using namespace std; typedef char DataType; typedef struct BitNode { DataType data; struct BitNode *lchild, *rchild;//左右結點 }*BitTree; /*初始化一個二叉樹*/ void Init(BitTree &BT) { BT = (BitTree)malloc(sizeof(BitNode)); BT->data = NULL; return
; } /*按照先序次序建立二叉樹*/ int BinTreeCreate(BitTree &BT) { char ch; scanf("%c", &ch); if(ch == '#') BT = NULL; else{ BT = (BitTree)malloc(sizeof(BitNode)); BT->data = ch; BinTreeCreate(BT->lchild); BinTreeCreate(BT->rchild); } return
0; } /*判斷二叉樹是否為空*/ bool BinTreeEmpty(BitTree BT) { if(BT == NULL) return true; return false; } /*先序遍歷二叉樹*/ void BinTraverse(BitTree BT) { if(BT == NULL) return; printf("%c",BT->data); if(BT->lchild != NULL) BinTraverse(BT->lchild); if(BT->rchild != NULL); BinTraverse(BT->rchild); } /*求二叉樹的深度*/ int BinTreeDepth(BitTree BT) { int depth; if(BT) { int depthLeft = BinTreeDepth(BT->lchild); int depthRight = BinTreeDepth(BT->rchild); depth = 1 + max(depthLeft, depthRight);//樹的深度取左子樹和右子樹中高度的最大值 } else depth = 0; return depth; } /*求二叉樹中結點個數*/ int BinTreeCount(BitTree BT) { int cnt; if(BT) { int cntLeft = BinTreeCount(BT->lchild); int cntRight = BinTreeCount(BT->rchild); cnt = cntLeft + cntRight + 1;//左子樹的結點數加上右子樹的結點數 } else cnt = 0; return cnt; } int main() { BitTree BT; printf("1.初始化二叉樹 2.按先序序列建立二叉樹 3.判斷二叉樹是否為空.\n"); printf("4.先序遍歷二叉樹 5.求二叉樹的深度 6.求二叉樹結點的個數. 7.退出\n"); while(1) { int choose; printf("請輸入選擇:"); scanf("%d", &choose); if(choose == 7) break; switch(choose) { case 1: Init(BT); break; case 2: getchar();//接收回車 BinTreeCreate(BT); // printf("%c", BT->data); break; case 3: if(BinTreeEmpty(BT)) printf("二叉樹為空!\n"); else printf("二叉樹不為空!\n"); break; case 4: printf("先序遍歷二叉樹序列如下:"); BinTraverse(BT); printf("\n"); break; case 5: printf("二叉樹的深度為 %d\n", BinTreeDepth(BT)); break; case 6: printf("二叉樹的結點數為 %d\n", BinTreeCount(BT)); break; } } return 0; }

這裡寫圖片描述