面试题39_2 判断一棵树是不是平衡二叉树
来源:互联网 发布:jqueryfileupload Java 编辑:程序博客网 时间:2024/05/22 05:32
思想一:在求树深度的基础下,对每个节点的左右子树求深度,按照定义,左右子树的深度差不超过1就是平衡二叉树。
缺点:需要重复遍历
//求树的深度
int TreeDepth(BinaryTreeNode* pRoot)
{
if(pRoot == NULL)
return 0;
int nletf=TreeDepth(pRoot->m_pLeft);
int nright=TreeDepth(pRoot->pRight);
return (nleft > nright)? (nleft + 1) :(nright + 1);
}
//判断是不是平衡二叉树
bool IsBalanced(BinaryTreeNode* pRoot)
{
if(pRoot ==NULL)
return true;
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);
}
思想二:如果我们用后序遍历的方式遍历二叉树的每一个节点,在遍历到一个节点之前我们就已经遍历了它的左右子树,只要在遍历每个节点的时候记录它的深度,我们就可以一边遍历一边判断没个节点是不是平衡的。
bool IsBalanced(BinaryTreeNode* pRoot,int *pDepth)
{
if(pRoot==NULL)
{
*pDepth=0;
return true;
}
int left,right;
if(IsBalanced(pRoot->m_pLeft,&left)&&(IsBalanced(pRoot->m_pRight))
{
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);
}
在上面代码中,我们用后序遍历的方式遍历整颗二叉树。在遍历某节点的左右子节点之后,我们根据他的左右子节点的深度判断他是否平衡,并得到当前节点的深度。当我们遍历到根节点的时候,也就判断了整颗二叉树是不是平衡二叉树。
- 面试题39_2 判断一棵树是不是平衡二叉树
- 面试题39_2:平衡二叉树
- 程序员面试题精选-- 判断二叉树是不是平衡的
- 剑指offer面试题 39 二叉树的深度和判断是不是平衡树
- 面试题39:平衡二叉树判断
- 剑指offer面试题之判断一颗二叉树是不是平衡二叉树
- 程序员面试题精选100题(60)-判断二叉树是不是平衡的
- 程序员面试题精选100题(60)-判断二叉树是不是平衡的
- 程序员面试题精选100题(60)-判断二叉树是不是平衡
- 程序员面试题精选100题(60)-判断二叉树是不是平衡
- 程序员面试题精选100题(60)-判断二叉树是不是平衡[数据结构]
- 程序员面试题精选100题(60)-判断二叉树是不是平衡[数据结构]
- 判断一棵树是不是平衡二叉树
- 面试题39(2). 判断是否为平衡二叉树
- 判断二叉树是不是平衡
- 判断二叉树是不是平衡
- 判断二叉树是不是平衡[
- 判断二叉树是不是平衡
- Linux内核多线程(二)
- 计算表格的总计
- boost asio学习笔记(2) echo 客户端
- 回归和梯度下降
- SpringMVC简单构造restful, 并返回json
- 面试题39_2 判断一棵树是不是平衡二叉树
- Visual Studio 2013 环境下部署、设置 openCV3.0rc 开发环境
- Adapter实例
- 影响网站排名的十大改动
- 创新思维---罗马数字
- Linux内核多线程(三)
- 常用下载地址
- Spark概述
- Java基础之ArrayList与LinkedList、Vector,以及HashMap与HashTable的区别