平衡二叉树
题目描述
给定一个二叉树,判断它是否是高度平衡的二叉树。一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。
解题思路
高度平衡二叉树,在之前做过的树的深度的题的基础上,求解每个节点的高度(深度)判断其左右子树的高度差的绝对值不超过1即可。
函数返回值为bool型。返回return ture/false。或者返回return 返回值为true/false的函数地址(对地址返回值进行逻辑运算)
- 首先判断节点为空的话,该节点的左右子树一定满足高度平衡。return true;
- 建立整型变量来存储当前节点的左右子树高度(调用求高度函数),并进行比较判断。 int left,right;left=TreeDepth(root->left);right=TreeDepth(root->right);
- 先判断,如果左右子树的高度同时小于等于1,那么一定满足高度平衡。(这也是递归的终止条件,表示最后叶节点的高度)if(left<=1&&right<=1)return ture;
- 如果当前节点不是叶节点,那么判断当前节点的左右子树的高度差绝对值<=1。如果满足,那么当前节点平衡,需要继续判断下一步节点的左右子树节点是否都平衡;如果不满足,那么久不是平衡二叉树。if(abs(left-right)<=1) {return (isBalanced(root->left)&&isBalance(root->right));}else return false;
- 编写要调用的高度函数在求树的深度那一题里面写过。强调函数定义:int TreeDepth(TreeNode* root)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isBalanced(TreeNode* root)
{
if(!root) return true;
int left,right;
left=TreeDepth(root->left);
right=TreeDepth(root->right);
if(left<=1&&right<=1) return true;
if(abs(left-right)>1)
{return false;}
else
{return (isBalanced(root->left)&&isBalanced(root->right));}
}
int TreeDepth(TreeNode* pNode)
{
if(!pNode) return 0;
int left=TreeDepth(pNode->left)+1;
int right=TreeDepth(pNode->right)+1;
return left>right?left:right;
}
};
重点要记忆:
1、因为第一次接触返回bool值的函数,在返回值这里查缺补漏。重新刷一遍之前的题,重点留意了一下不同类型函数定义,以及不同返回类型。void、int、TreeNode*、bool
2、对递归终止条件的认识不深,以前的if(!pNode) return nullptr;以及if(!pNode) return 0;等等,都是递归的终止条件,到的是空节点停止递归。而本题是用深度条件来提前结束递归,不然就得等到if(!root) return true。But,我将提前结束递归注释掉之后也没问题。TAT我凌乱了,不过这让我注意到递归的终止条件的存在感,编写递归时,先想想终结条件,并写在第一句上 很重要!
3、高度差的绝对值:abs(),第一遍编写的时候忘了加绝对值,所以只通过了一半。很重要!
4、bool函数递归调用,return ()。
按照镜像二叉树的学习,我一开始直接写成了(isBalanced(root->left),isBalance(root->right)),编译能通过,结果会错误,因为它们没有进行与运算,不同时满足左右子树,输出的结果只是将最后的右子树是不是平衡的判断结果发出来。
所以一定要记得,什么时候需要左右子树都满足的&&返回,什么时候分别用“,”返回。我觉得我还会犯这错误,记一下
5、编写深度(高度函数时),对于函数定义那一块的编写不了解。之前刷题只注意函数内的程序编写,没注意函数的定义书写
这一点在之后刷题时一定要惊醒!这不仅关系着返回值编写,还关系着以后遇到问题需要单独编写时 不会编的问题
int TreeDepth(TreeNode* pNode){}