判断一棵树是否平衡,需要注意的是和判断一棵树是否为平衡二叉树的区别。 平衡二叉树的定义为:它是一棵空树或它的左右两个子树的高度差的绝对值不超过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; }