平衡二叉樹的定義是,對於樹中的任一節點,其左右子樹高度差不超過1(即只可以爲-1,0,1三種情況)
這裏的樹的高度是指從葉子節點(高度爲0)算起的左右子樹最高的值+1。這裏也有遞歸的邏輯。
判斷一顆樹(樹的唯一標誌/入口是其root節點)是否平衡,就是比較其左右子樹的高度差是否小於1.。
現在的解決方案是,遞歸思想+樹的後續遍歷
遞歸需要對每一個節點都進行處理,
對於一般的節點,遞歸的邏輯是,
(1)獲得其左子樹的高度,獲得其右子樹的高度
(2)判斷左右子樹高度差是否小於1,若是則取max(左右子樹)+1作爲樹的高度,此次遞歸結束。若>1則說明樹不平衡,函數退出exit(0)
(3)遞歸的結束條件是,若樹爲NULL,則高度爲0,遞歸出棧。。
所以,綜上,遞歸的返回值應該是一個高度!
核心代碼:
int highTree(BTree root){
if(!root) return 0;
int leftH = highTree(root->left);
int rightH = highTree(root->right);
if(abs(leftH-rightH)>1)
{
printf("non blance truee \n");
exit(0);
}
return ((leftH > rightH)?leftH:rightH) +1; 這個函數同時也返回樹的高度,在求樹高度的同時,判斷該樹是否爲平衡二叉樹
}
OVER!!!