判斷一棵樹是否平衡,需要注意的是和判斷一棵樹是否爲平衡二叉樹的區別。 平衡二叉樹的定義爲:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1, 並且左右兩個子樹都是一 棵平衡二叉樹。 此時指的是這棵樹任意兩個葉子結點到根結點的距離之差不大於1。
節點定義爲:
struct Node{
int key;
Node *lchild, *rchild, *parent;
};
只需要求出離根結點最近和最遠的葉子結點,然後看它們到根結點的距離之差是否大於1即可。
void getDepth(Node *head){
if(head == NULL) return;
++d;
getDepth(head->lchild);
if(head->lchild == NULL && head->rchild == NULL)
dep[num++] = d;
getDepth(head->rchild);
--d;
}
求出所有葉子結點到根結點的距離後,再求出其中的最大值和最小值, 然後作差與1比較即可。此外,空樹認爲是平衡的。代碼如下:
bool isBalance(Node *head){
if(head == NULL) return true;
getDepth(head);
int max = dep[0], min = dep[0];
for(int i=0; i<num; ++i){
if(dep[i]>max) max = dep[i];
if(dep[i]<min) min = dep[i];
}
if(max-min > 1) return false;
else return true;
}