判断二叉树是不是平衡二叉树
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;
}
还有一种方法就是,我们可以从叶子节点开始判断,在判断过后再取得其深度,这样即判断了又取得深度了,一举两得,一直到根节点,其实只遍历了一次。
下面贴出两种方法的代码:
方法一:
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;
}
相关文章推荐
- sql server字符串非空判断实现方法
- C#中实现判断某个类是否实现了某个接口
- C#判断多个文本框是否为空的方法
- C#实现判断操作系统是否为Win8以上版本
- 使用dos批处理文件的几个高级命令,判断
- PHP判断IP并转跳到相应城市分站的方法
- CMS中PHP判断系统是否已经安装的方法示例
- C#判断一个图像是否是透明的GIF图的方法
- C#判断指定驱动器是否已经准备就绪的方法
- C#判断给定IP地址是否在指定范围内的方法
- C#判断某程序是否运行的方法
- C#判断上传文件是否是图片以防止木马上传的方法
- asp 空值测试判断函数
- javascript 出生日期和身份证判断大全
- js判断浏览器版本以及浏览器内核的方法
- js检测判断日期大于多少天的方法
- jQuery判断元素上是否绑定了指定事件的方法
- jQuery判断对象是否存在的方法
- Checbox的操作含已选、未选及判断代码
- javascript判断变量是否有值的方法