代码随想录算法训练营第21天|LeetCode110.平衡二叉树
1、LeetCode110.平衡二叉树
平衡二叉树:该树所有节点的左右子树的高度相差不超过 1。
明确深度与高度的定义。
根节点的深度究竟是1 还是 0,有不同标准,leetcode的题目中都是以节点为一度,即根节点深度是1。若以边为1度,那么根节点的深度为0。
注意:求深度可以从上到下去查,所以需要前序遍历(中左右),而高度只能从下到上去查,所以只能后序遍历(左右中)。
深度:因为左右子节点的深度是依赖根节点的深度多少,因此需要先计算根节点的深度,再计算左右节点,对应的是先序遍历。
高度:需要根据左右子树的高度去计算根节点的高度。(max+1)即先左右再根,因此是后序遍历。
思路
本题要求高度,那么是后序遍历。
递归法
getHeight()
- 递归函数参数和返回值
传入节点,然后返回这个节点的高度。当发现一个节点的左右子树高度差超过1,那么返回-1表示已经不平衡了。-1经过层层传递直到root。
int getHeight(Node node)
- 终止条件
如果是空节点,那么返回0.
-
单层递归的逻辑
因为是后序遍历,因此左右中。
- 先左节点。若为-1,直接返回-1.
- 再右节点。若为-1,直接返回-1.
- 均不为-1,比较两者之差是否超过1。超过1则返回-1,不超过则max(left, right)+1。
代码
class Solution {
public:
int getHeight(TreeNode* node){
if(node == NULL)
return 0;
// 后序遍历 左
int leftH = getHeight(node->left);
// 如果已经出现不平衡现象,直接返回,层层传递到root
if(leftH == -1)
return -1;
// 右
int rightH = getHeight(node->right);
if(rightH == -1)
return -1;
if(abs(leftH-rightH) > 1)
return -1;
// 中
return max(leftH, rightH)+1;
}
bool isBalanced(TreeNode* root) {
if(root == NULL)
return true;
int res = getHeight(root);
return res == -1 ? false : true ;
}
};