判断是否为平衡二叉树

题目链接:https://leetcode-cn.com/problems/balanced-binary-tree
题目描述:
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:true

示例 2:

输入:root = [1,2,2,3,3,null,null,4,4]
输出:false

示例 3:
输入:root = []
输出:true

题解:
题解描述链接:https://mp.weixin.qq.com/s/isUS-0HDYknmC0Rr4R8mww
递归三步曲分析:

  1. 明确递归函数的参数和返回值
    参数为传入的节点指针,返回要传入节点为根节点树的深度。
    如果当前传入节点为根节点的二叉树已经不是二叉平衡树了,还返回高度的话就没有意义了。
    所以如果已经不是二叉平衡树了,可以返回-1 来标记已经不符合平衡树的规则了。
// -1 表示已经不是平衡二叉树了,否则返回值是以该节点为根节点树的高度
int getDepth(TreeNode* node)
  1. 明确终止条件
    递归的过程中依然是遇到空节点了为终止,返回0,表示当前节点为根节点的高度为0
if (node == NULL) {
    return 0;
}
  1. 明确单层递归的逻辑
    如何判断当前传入节点为根节点的二叉树是否是平衡二叉树呢,分别求出左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则则返回-1,表示已经不是二叉树了。

int leftDepth = depth(node->left); // 左
if (leftDepth == -1) return -1;     
int rightDepth = depth(node->right); // 右
if (rightDepth == -1) return -1;

int result;
if (abs(leftDepth - rightDepth) > 1) {  // 中
    result = -1;
} else {
    result = 1 + max(leftDepth, rightDepth); // 以当前节点为根节点的最大高度
}

return result;

完整代码:


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
     //深度:从根节点到该节点最长简单路径边的条数(leetcode以节点计算)-前序遍历
    //高度:该节点到叶子节点最长简单路径边的条数(leetcode以节点计算)-后序遍历
    int getHigh(TreeNode* node) //返回当前节点最大高度
    {
        if(node == nullptr)
        {
            return 0;
        }
        int leftHigh = getHigh(node->left);
        if(leftHigh == -1)
            return -1;
        int rightHigh = getHigh(node->right);
        if(rightHigh == -1)
            return -1;
        return abs(leftHigh - rightHigh) > 1 ? -1 : max(leftHigh, rightHigh) + 1;
    }
    bool isBalanced(TreeNode* root) {
        return getHigh(root) == -1 ? false : true;


    }
};
posted @ 2021-02-05 14:44  张宵  阅读(141)  评论(0编辑  收藏  举报