https://leetcode.cn/problems/balanced-binary-tree/
本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
简单理解就是,要求二叉树某个节点的两个子节点高度差不能超过1,如果把某节点看作根节点的话,即次节点为根节点的二叉树的高度差不能超过1。
这里强调一波概念:
二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。
二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。
这个时候我们发现和之前的深度计算有所区别,之前使用层序遍历解决深度问题的时候,我们都是从根节点出发逐渐增加depth的值,但是这道题的根节点是不断改变的,也就是我们遍历的每一个节点都会看做根节点,然后判断他的子节点(如果有)差距是否大于1,所以无法应用层序遍历进行,需要考虑递归或迭代。
如果考虑递归迭代 ,我们发现后序遍历是我们所需要的,因为我们要求某节点的高度,都是从叶子节点入手,最后考虑中间节点,故采用后序遍历的”左右中“是我们所需的。
确定了遍历思路后,我们开始确定递归的三要素,
参数返回值:
我们的参数是node节点,返回的是该节点作为根节点的时候,子节点的高度。
终止条件:
和以往一样,当遍历到空的时候结束。
单层递归逻辑:
首先明确左右中的顺序,先处理左节点(得到左节点对应的高度)再处理右节点。最后计算左右节点高度差。分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。
int leftHeight = getHeight(node -> left);
if(leftHeight == -1) return -1;
int rightHeight = getHeight(node -> right);
if(rightHeight == -1) return -1;
return abs(leftHeight - rightHeight)> 1?-1:1 + max(leftHeight, rightHeight);
class Solution {
public:
bool isBalanced(TreeNode* root) {
return getHeight(root) == -1 ? false : true;
}
int getHeight(TreeNode* node){
if (node == nullptr) {
return 0;
}
int leftHeight = getHeight(node -> left);
if(leftHeight == -1) return -1;
int rightHeight = getHeight(node -> right);
if(rightHeight == -1) return -1;
return abs(leftHeight - rightHeight)> 1?-1:1 + max(leftHeight, rightHeight);
}
};