输入一颗二叉树的根节点,判断该树是不是平衡二叉树
来源:互联网 发布:球球大作战辅助软件 编辑:程序博客网 时间:2024/04/30 12:48
输入一颗二叉树的根节点,判断该树是不是平衡二叉树
1. 解法一
该解法的思路:在遍历树的每个节点的时候,调用函数TreeDepth得到它的左右子树的深度。如果每个节点的左右子树的深度相差都不超过1,按照定义就是一棵平衡的二叉树。
代码为:
bool IsBalanced(BinaryTreeNode* pRoot)
{
if(pRoot==NULL)
return false;
int left=TreeDepth(pRoot->m_pLeft);
int right=TreeDepth(pRoot->m_pRight);
int diff=left-right;
if(diff>1||diff<-1)
return false;
return IsBalanced(pRoot->m_pLeft)&& IsBalanced(pRoot->m_pRight);;
}
int TreeDepth(BinaryTreeNode* pRoot)
{
if(pRoot==NULL)
return 0;
int nLeft=TreeDepth(pRoot->m_pLeft);
int nRight=TreeDepth(pRoot->m_pRight);
return (nLeft>nRight)?(nLeft+1):(nRight+1);
}
上面的方法有着重复遍历节点多次的缺点。
2. 解法二
如果我们用后序遍历的方式遍历二叉树的每一个节点,在遍历到一个节点之前我们就已经遍历了它的左右子树。只要在遍历每个节点的时候记录了它的深度,我们就可以一边遍历一边判断每个节点是不是平衡的。
代码为:
bool IsBalanced(BinaryTreeNode* pRoot,int *depth)
{
if(pRoot==NULL)
{
*depth=0;
return true;
}
int left;
int right;
if(IsBalanced(pRoot->m_pLeft,&left) && IsBalanced(pRoot->m_pRight,&right))
{
int diff=left-right;
if(diff<=1 && diff>=-1)
{
*pDepth=1+(left>right?left:right);
return true;
}
}
return false;
}
我们只需要给上面的函数传入二叉树的根节点及一个表示节点深度的整形变量即可:
bool IsBalanced(BinaryTreeNode* pRoot)
{
int depth=0;
return IsBalanced(pRoot,&depth);
}
- 输入一颗二叉树的根节点,判断该树是不是平衡二叉树
- 剑指offer 39---求二叉树的深度 && 输入一颗二叉树的根节点,判断该树是不是平衡二叉树
- 题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树
- 【2】输入一颗二叉树判断是不是平衡二叉树
- 判断二叉树是不是平衡
- 判断二叉树是不是平衡
- 判断二叉树是不是平衡[
- 判断二叉树是不是平衡
- 判断二叉树是不是平衡
- 判断是不是平衡二叉树
- 判断二叉树是不是平衡
- 判断二叉树是不是平衡
- 判断二叉树是不是平衡的
- 判断二叉树是不是平衡的
- 判断二叉树是不是平衡的
- 【Leetcode】判断一棵二叉树是不是平衡二叉树
- 判断一棵二叉树是不是平衡二叉树
- 输入一棵二叉树,判断该二叉树是否是平衡二叉树。
- 【辅助工具】20款优秀的移动产品原型和线框图设计工具
- IOS 计时器 NSTimer
- 蓝牙HCI编程初步
- 程序设计基本概念
- 毕业生转正定级重要性
- 输入一颗二叉树的根节点,判断该树是不是平衡二叉树
- 如何将上传图片直接保存至SQL Server数据库中
- 【IOS】动画总结:UIView动画(Animations)
- Linux基本配置和管理 5 ---- RPM软件包管理
- PBOC卡片应用分析(一)
- metaq部署
- myeclipse配置tomcat
- java中常见的关于String的题目
- 2014迅雷校园招聘笔试题答案