zoukankan      html  css  js  c++  java
  • 判断是否为平衡二叉树

    题目链接: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;
    
    
        }
    };
    
  • 相关阅读:
    react项目如何调试?
    react使用引入svg的icon;svg图形制作
    react使用echarts
    SQL SEVER数据库重建索引的方法
    ThreadLocal的内存泄露
    ThreadLocal是否会引发内存泄露的分析 good
    深入分析 ThreadLocal 内存泄漏问题
    清理ThreadLocal
    线程池 Threadlocal 使用注意
    ThreadLocal对象使用过程中容易陷入的坑
  • 原文地址:https://www.cnblogs.com/ZigHello/p/14377646.html
Copyright © 2011-2022 走看看