資料結構二叉樹的實現(#表示空結點)
阿新 • • 發佈:2019-01-24
參考老師給的程式碼重新進行對二叉樹的實現與操作(畢竟是老師出題,風格要跟他來)
這一次的二叉樹是通過結點進行構建。
首先初始化二叉樹,就是將根節點開闢一個結點空間,進行初始化。
然後按照先序序列建立二叉樹則是通過遞迴左右子樹進行構建,輸入如果是 ‘#’,則表示為空結點,這樣輸入序列如果是 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;
}