您的位置:首页 > 其它

判断二叉树是不是平衡二叉树

2015-08-15 10:46 856 查看
判断一个二叉树是不是平衡二叉树,我们首先会想到的是先求得当前根节点的左子节点的深度和右子节点的深度,如果两个深度相差超过1,则不是平衡二叉树,这样的话,其实当我们从最开始的根节点开始时,我们从要从根节点开始遍历取得当前左子节点和右子节点的深度,这样其实是遍历了一次树,但是当我们判断得出当前根节点是平衡的,那当我们判断他的左子节点和右子节点呢?又要几乎遍历一次树,这样无疑复杂度会提高;

还有一种方法就是,我们可以从叶子节点开始判断,在判断过后再取得其深度,这样即判断了又取得深度了,一举两得,一直到根节点,其实只遍历了一次。

下面贴出两种方法的代码:

方法一:

int GetDepth(BinaryTreeNode* pRoot)
{
if(pRoot == NULL)
{
return 0;
}
int left = 0;
int right = 0;
left = GetDepth(pRoot->left);
right = GetDepth(pRoot->right);

return left > right ? left +1 :right +1;
}

bool IsBalanced(BinaryTreeNode* pRoot)
{
if(pRoot == NULL || (pRoot->left == NULL && pRoot->right == NULL))
{
return true;
}
int left = GetDepth(pRoot->left);
int right =GetDepth(pRoot->right);

int diff = left - right;
if(diff > 1 || diff < -1)
{
return false;
}

return IsBalanced(pRoot->left) && IsBalanced(pRoot->right);

}方法二:
bool IsBalanced(BinaryTreeNode* pRoot, int* pDepth)
{
if(pRoot == NULL)
{
*pDepth = 0;
return true;
}
int left,right;
if(IsBalanced(pRoot,&left) && IsBalanced(pRoot, &right))
{
int diff = left - right;
if(diff <= 1 && diff >= -1)
{
*pDepth = left > right ? left + 1 : right + 1;
return true;
}
}
return false;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息