输入一颗二叉树的根节点,判断该树是不是平衡二叉树
2013-09-10 10:43
429 查看
输入一颗二叉树的根节点,判断该树是不是平衡二叉树
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);
}
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】输入一颗二叉树判断是不是平衡二叉树
- 剑指offer面试题之判断一颗二叉树是不是平衡二叉树
- 题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树
- java数据结构-二叉树-判断一颗二叉树是否为平衡二叉树
- 输入一棵二叉树,判断该二叉树是否是平衡二叉树。
- 输入两棵二叉树A,B,判断B是不是A的子结构(c++实现)
- 判断一个节点是否在一棵二叉树中和判断一颗二叉树是否是另一颗树的子树——题集(十二)
- 判断一个节点是否在一棵二叉树中&判断一颗二叉树是是否是另一颗树的子树
- 判断二叉树是不是平衡二叉树
- 第6天 输入两棵二叉树A和B,判断B是不是A的子结构。
- 判断二叉树是不是平衡二叉树
- 【判断一个节点是否在一棵二叉树中】/【判断一颗二叉树是是否是另一颗树的子树】
- 输入一棵二叉树,判断该二叉树是否是平衡二叉树。
- day12之判断一棵二叉树是否是平衡二叉树+求一颗二叉树的镜像+判断一个数在二维数组中是否存在
- 输入两颗二叉树A,B,判断B是不是A的子结构
- 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
- 判断一棵二叉树是不是平衡二叉树
- 请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
- Same Tree,判断两个二叉树是不是相同的树,结构相同,每个节点的值相同