判断树是否平衡
2016-03-20 本文已影响227人
AwesomeAshe
其实关于树的好多题都是递归的。。
首先复习一下什么是平衡树:
平衡二叉树即:所有节点的左右子树的高度差不超过1
思路之一:
求每个节点的高度
假设我们有一个getTreeDepth(TreeNode* tree )
的函数
然后这样:
bool IsBalanced(TreeNode* tree)
{
if (tree == NULL)
return 1;
int leftHigh = getTreeDepth(tree->left);
int rightHigh = getTreeDepth(tree->right);
if (leftHigh - rightHigh > 1 || leftHigh - rightHigh < -1)
return false;
return IsBalanced(tree->left) && IsBalanced(tree->right);
}
但是呢,这个方法有一个老问题,就是普通的递归求Fibnacci数列的直接调用f(n)=f(n-1)+f(n-2)
这个函数会导致大量的重复计算,上面这个函数也是这样,我们从根节点开始算depth也是遍历了很多次,所以我们稍稍改进一下:
bool IsBalanced(TreeNode* tree, int* depth)
{
if (tree == NULL)
{
*depth = 0;
return true;
}
int left, right;
if (IsBalanced(tree->left, &left) && IsBalanced(tree->right, &right))
{
int diff = left - right;
if (diff >= -1 && diff <= 1)
{
*depth = (left > right ? left : right) + 1;
return true;
}
}
return false;
}
bool IsBalanced(TreeNode* tree)
{
int depth = 0;
return IsBalanced(tree, &depth);
}
其实思路是差不多的,只是通过递归的方法,从最下面开始计算。
同样的思路也可以求路径长呢。
文章参考何海涛大神文章