首先,看一下平衡二叉树的定义:
平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
思路:利用递归的思想
代码:
int DepthTree(BSTreeNode *pbs)
{
if (pbs==NULL)
return 0;
else
{
int leftLength=DepthTree(pbs->left);
int rigthLength=DepthTree(pbs->right);
return 1+(leftLength>rigthLength ? leftLength:rigthLength);
}
}
bool isBalanceTree(BSTreeNode *pbs)
{
if (pbs==NULL)
{
return true;
}
int depthLeft=DepthTree(pbs->left);
int depthRight=DepthTree(pbs->right);
if (abs(depthLeft-depthRight)>1)
return false;
else
return isBalanceTree(pbs->left) && isBalanceTree(pbs->right);
}
改进:这样实际上是有很多重复计算的,如果想进一步提高效率的话则需要考虑如何每个结点只遍历一次。
其实就是一边遍历一遍进行判断。
代码:
bool isBalanceTree(Node* pRoot, int * pDepth)
{
if(pRoot==NULL)
{
*pDepth = 0;
return true;
}
int right,left;
if(isBalanceTree(pRoot->left,&left)&&isBalanceTree(pRoot->right,&right))
{
if(left-right < 1 && right-left < 1)
{
pDepth = 1 + (left>right)?left:right;
return true;
}
}
return false;
}
方法一和方法二,一个是从上往下进行判断,一个是从下往上进行判断,一个有很多重复,一个没有重复,读者可以自己体会。
本文详细介绍了平衡二叉树的概念及其实现方法。通过两种不同的递归方式来判断一棵二叉树是否为平衡二叉树,并针对每种方法进行了代码实现。此外,还探讨了如何避免重复计算以提高算法效率。
1160

被折叠的 条评论
为什么被折叠?



