判断一棵树是否为平衡二叉树的算法
2016-04-18 01:20
281 查看
上厕所时饶有兴致地看了下leetCode的110题,难度为easy,于是给了自己信心:判断一棵树是否为平衡二叉树。
平衡二叉树,即一棵树的左子树与右子树的深度之差不能大于1,并且每一个子节点都是平衡二叉树。
此问题解决方案应该有很多,可以递归,也可以不递归,递归当然容易理解,代码也偏少,但使用递归得注意一点,本问题需要完成两步:1、得到一个节点左右子树的深度,计算差值。2、对这棵树的每个子节点均重复1的计算与判断。
1、计算左右子树深度,计算差值,有很好的算法:
int getTreeDepth(TreeNode* root)
{
int deep = 0;
if(root != NULL)
{
int leftDeep = getTreeDepth(root->left);
int rightDeep = getTreeDepth(root->right);
deep = leftDeep > rightDeep?leftDeep+1:rightDeep+1;
}
return deep;
}
逻辑就是调用递归遍历左右子树,令最末端的节点深度为1,然后逐层累加即可。
这里参考了:/article/7037570.html,里面还包含有非递归的取深度,有待学习。
2、对每个节点均执行,做法同上,稍稍有微调,采用先序遍历算法,先计算父节点,然后到两个子。
总的代码如下:
class Solution {
public:
int getTreeDepth(TreeNode* root)
{
int deep = 0;
if(root != NULL)
{
int leftDeep = getTreeDepth(root->left);
int rightDeep = getTreeDepth(root->right);
deep = leftDeep > rightDeep?leftDeep+1:rightDeep+1;
}
return deep;
}
public:
bool isBalanced(TreeNode* root) {
if(root == NULL)
return true;
int leftLv = getTreeDepth(root->left);
int rightLv = getTreeDepth(root->right);
int div = leftLv > rightLv?leftLv - rightLv:rightLv - leftLv;
if(div > 1)
return false;
int res = isBalanced(root->left) && isBalanced(root->right);
if(res)
return true;
return false;
}
};
这是递归的做法,后续有时间可以研究非递归算法。
平衡二叉树,即一棵树的左子树与右子树的深度之差不能大于1,并且每一个子节点都是平衡二叉树。
此问题解决方案应该有很多,可以递归,也可以不递归,递归当然容易理解,代码也偏少,但使用递归得注意一点,本问题需要完成两步:1、得到一个节点左右子树的深度,计算差值。2、对这棵树的每个子节点均重复1的计算与判断。
1、计算左右子树深度,计算差值,有很好的算法:
int getTreeDepth(TreeNode* root)
{
int deep = 0;
if(root != NULL)
{
int leftDeep = getTreeDepth(root->left);
int rightDeep = getTreeDepth(root->right);
deep = leftDeep > rightDeep?leftDeep+1:rightDeep+1;
}
return deep;
}
逻辑就是调用递归遍历左右子树,令最末端的节点深度为1,然后逐层累加即可。
这里参考了:/article/7037570.html,里面还包含有非递归的取深度,有待学习。
2、对每个节点均执行,做法同上,稍稍有微调,采用先序遍历算法,先计算父节点,然后到两个子。
总的代码如下:
class Solution {
public:
int getTreeDepth(TreeNode* root)
{
int deep = 0;
if(root != NULL)
{
int leftDeep = getTreeDepth(root->left);
int rightDeep = getTreeDepth(root->right);
deep = leftDeep > rightDeep?leftDeep+1:rightDeep+1;
}
return deep;
}
public:
bool isBalanced(TreeNode* root) {
if(root == NULL)
return true;
int leftLv = getTreeDepth(root->left);
int rightLv = getTreeDepth(root->right);
int div = leftLv > rightLv?leftLv - rightLv:rightLv - leftLv;
if(div > 1)
return false;
int res = isBalanced(root->left) && isBalanced(root->right);
if(res)
return true;
return false;
}
};
这是递归的做法,后续有时间可以研究非递归算法。
相关文章推荐
- Java中@Override的作用
- H3C IMC MSSQL部分数据库结构
- iOS隐藏状态栏
- 2,GC
- Struts中实现验证码生成和验证
- Jquery学习之旅之捕获和设置
- 在 Windows 下将免安装版的 Apache HTTP 或 Apahce Tomcat 作为服务 开机并在后台自动启动
- 【Android】如何快速构建Android Demo
- 我8月分可能在家 1.1.1
- Java 设计模式 - 装饰模式
- windows下多进程加协程并发模式
- windows下多进程加协程并发模式
- 【Android】如何实现ButterKnife
- OSChina 周一乱弹 ——生死之际还能从容装逼,先生大才
- 【Android】如何写一个JsBridge
- 笔记本开WIFI简易批处理
- HashMap多线程并发问题分析
- java基础(7)--Java中的变量、数据类型、运算符
- Chromium网页绘图表面(Output Surface)创建过程分析
- Centos 7防火墙firewalld开放80端口