剑指offer:判断二叉树是不是平衡二叉树
来源:互联网 发布:什么是软件过程模型 编辑:程序博客网 时间:2024/06/05 01:53
题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
算法:
平衡二叉树的定义:平衡二叉树是一棵空树或者是左右子树高度差的绝对值不超过1的树,平衡二叉树的子树也是平衡二叉树。
我们采用后续遍历的方式,要判断一棵二叉树是不是平衡二叉树,先判断他的左右子树是不是平衡二叉树,并返回左右子树的高度。
1、如果左右子树中有一个不是平衡二叉树,那么这棵树就不是平衡的
2、如果左右子树都是平衡的,再判断左右子树的高度差来决定以当前节点为根的树是不是平衡的。
bool IsBalanced_Solution(TreeNode* pRoot) {
if (NULL == pRoot){
return true;
}
int height = 0;
bool balance = false;
IsBaLanced_Solution(pRoot, height, balance);
return balance;
}
void IsBaLanced_Solution(TreeNode* pRoot, int &height, bool &balance){ //判断以pRoot所指的节点为根的树是不是平衡的,返回bool值balance表示是否平衡,并返回树的高度
if (pRoot == NULL){
height = 0;
balance = true;
return;
}
int leftH = 0;
int rightH = 0;
bool leftB = false;
bool rightB = false;
IsBaLanced_Solution(pRoot->left, leftH, leftB);
IsBaLanced_Solution(pRoot->right, rightH, rightB);
if (leftB && rightB){
if (abs(leftH - rightH) <= 1){
height = (leftH > rightH ? leftH : rightH) + 1;
balance = true;
}
else {
balance = false;
}
}
else {
balance = false;
}
return;
}
if (NULL == pRoot){
return true;
}
int height = 0;
bool balance = false;
IsBaLanced_Solution(pRoot, height, balance);
return balance;
}
void IsBaLanced_Solution(TreeNode* pRoot, int &height, bool &balance){ //判断以pRoot所指的节点为根的树是不是平衡的,返回bool值balance表示是否平衡,并返回树的高度
if (pRoot == NULL){
height = 0;
balance = true;
return;
}
int leftH = 0;
int rightH = 0;
bool leftB = false;
bool rightB = false;
IsBaLanced_Solution(pRoot->left, leftH, leftB);
IsBaLanced_Solution(pRoot->right, rightH, rightB);
if (leftB && rightB){
if (abs(leftH - rightH) <= 1){
height = (leftH > rightH ? leftH : rightH) + 1;
balance = true;
}
else {
balance = false;
}
}
else {
balance = false;
}
return;
}
下面的代码与上面的思想是一样的。这里通过这道题对函数参数及其返回值,做个小的总结。因为,之前做题都是直接看别人的代码,自己不熟练,别人怎么写,自己就这么写。再者对函数参数功能理解不透彻,通过解题思路来看函数参数和函数返回值如何设置,为今后做题提供借鉴。
在这道题目中,我们要判断一棵二叉树是否为平衡二叉树。判断的依据是平衡的二叉树的左、右子树是平衡的,并且左右子树的高度差不超过1。
那么最自然的想法就是先判断左右子树是否为平衡二叉树,在判断当前子树是否为平衡二叉树。那么判断左右子树是否为平衡二叉树时,其实就是判断一个二叉树是否为平衡二叉树(递归的思想)。这个判断的结果可以用函数返回值来给出树是否为平衡的。
那么,在判断完左右子树后,就要判断根节点了。这里的判断需要左右子树的高度。难道再去递归求左右子树的高度吗?这里就需要设定一个函数参数,并且这个参数是引用形式。在判断左右子树的同时,返回左右子树的高度。这样一举两得。
class Balance {
public:
bool isBalance(TreeNode* root) {
// write code here
if (NULL == root){
return true;
}
int height;
return isBalance(root, height);
}
bool isBalance(TreeNode* root, int &height){
if (root == NULL){
return true;
height=0;
}
int leftH = 0;
int rightH = 0;
bool balaLeft = true;
bool balaRight = true;
balaLeft = isBalance(root->left, leftH);
balaRight = isBalance(root->right, rightH);
height = leftH > rightH ? (leftH + 1) : (rightH + 1);
return (balaLeft && balaRight && (abs(leftH - rightH) <= 1));
}
};
public:
bool isBalance(TreeNode* root) {
// write code here
if (NULL == root){
return true;
}
int height;
return isBalance(root, height);
}
bool isBalance(TreeNode* root, int &height){
if (root == NULL){
return true;
height=0;
}
int leftH = 0;
int rightH = 0;
bool balaLeft = true;
bool balaRight = true;
balaLeft = isBalance(root->left, leftH);
balaRight = isBalance(root->right, rightH);
height = leftH > rightH ? (leftH + 1) : (rightH + 1);
return (balaLeft && balaRight && (abs(leftH - rightH) <= 1));
}
};
0 0
- 剑指offer:判断二叉树是不是平衡二叉树
- 判断二叉树是不是平衡
- 判断二叉树是不是平衡
- 判断二叉树是不是平衡[
- 判断二叉树是不是平衡
- 判断二叉树是不是平衡
- 判断是不是平衡二叉树
- 判断二叉树是不是平衡
- 判断二叉树是不是平衡
- 剑指offer面试题之判断一颗二叉树是不是平衡二叉树
- 剑指offer:判断二叉树是不是平衡二叉树(java)
- 判断二叉树是不是平衡二叉树
- 判断二叉树是不是平衡二叉树
- 判断二叉树是不是平衡二叉树
- 判断二叉树是不是平衡二叉树
- 判断二叉树是不是平衡二叉树
- 判断二叉树是不是平衡二叉树
- 判断二叉树是不是平衡二叉树
- JAVA第五讲
- 2016年3月19日,如何在web页面里面实现拨打电话的功能
- 数据恢复软件 整理
- 序列自增长
- 蓝桥杯 历届试题 还是畅通工程
- 剑指offer:判断二叉树是不是平衡二叉树
- Comparator Comparable区别
- POJ 2486 Apple Tree(树形dp)
- 计算机网络经典问题
- RPG的错排和求组合数
- 自建Oauth provider(使用doorkeeper gem)
- Retrofit2.0源码简要解析
- [linux]ubuntu下使用Fillder
- R语言入门总结