5.11 訓練日誌

1:二叉樹的基本性質
一、二叉樹第 i 層上最多有2i-1個節點
二、深度爲 k 的二叉樹,最多有2k - 1個節點
三、對於任意一顆二叉樹T,如果其終端節點數爲n1度數爲2的節點數爲n2 則 n1 = n2 + 1;
四、具有n個節點的完全二叉樹深度爲[ log2n] + 1
2:遞歸建立二叉樹
遞歸常見二叉樹,先從左子樹開始,arr 是調用傳值過去的節點值,i 用於移動數組內的節點值
//創建二叉樹
Struct CreateBiTree(BiTree &T, char arr[]){
if(arr[i] == ’ '){
i++;
T = NULL;
}else{
T = (BiTree)malloc(sizeof(BiNode));
if(!T){
exit(ERROR);//分配空間失敗;
}
T->data = arr[i];
i++;
CreateBiTree(T->lchild, arr);
CreateBiTree(T->rchild, arr);
}
return OK;
}
3:遞歸遍歷二叉樹(先序,中序,後序)
這是三中常規的遍歷二叉樹的方法,用的非常多,不僅便於理解,而且三個函數只是調用順序不同,所以書上頁數先給出了這三種遍歷。當然在面試中也長問到。
//先序遍歷(遞歸方法)
int PrintTree(BiTree T){
if(T){
printf("%c ",T->data);
PrintTree(T->lchild);
PrintTree(T->rchild);

}
return OK;

}

//中序遍歷(遞歸方法)
int PrintTreeL(BiTree T){
if(T){
PrintTreeL(T->lchild);
printf("%c ",T->data);
PrintTreeL(T->rchild);
}
return OK;
}

//後序遍歷(遞歸方法)
int PrintTreeR(BiTree T){
if(T){
PrintTreeR(T->lchild);
PrintTreeR(T->rchild);
printf("%c ",T->data);
}
return OK;
}
4.求二叉樹中的節點個數
//統計二叉樹節點的個數
void getTreeNodeNum(BiTree T,int &num){
if(!T){
num = 0;
}
num++;
if(T->lchild){
getTreeNodeNum(T->lchild,num);
}
if(T->rchild){
getTreeNodeNum(T->rchild,num);
}
}
5.求二叉樹的深度
思想就是從左子樹開始遍歷,遞歸完整個樹結構,如果二叉樹不爲空,二叉樹的深度 = max(左子樹深度, 右子樹深度) + 1,參考代碼如下:
//得到樹的深度
int getTreeHeight(BiTree T){
int hl,hr,max;
if(T!=NULL){
hl=getTreeHeight(T->lchild);
hr=getTreeHeight(T->rchild);
max=hl>hr?hl:hr;
return (max+1);
}else{
return 0;
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章