• 平衡二叉树


    Leetcode题目描述

    给定一个二叉树,判断它是否是高度平衡的二叉树。

    本题中,一棵高度平衡二叉树定义为:

    一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

    示例 1:

    给定二叉树 [3,9,20,null,null,15,7]

        3
       / 
      9  20
        /  
       15   7
    返回 true 。
    

    示例 2:

    给定二叉树 [1,2,2,3,3,null,null,4,4]

          1
          / 
         2   2
        / 
       3   3
      / 
     4   4
    

    返回 false 。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/balanced-binary-tree

    自顶向下

    深度优先的解决方式,需要解决两个特性

    • 特性一,当前节点的左右子树高度差小于或者等于1
    • 特性二,左右两个子树中的节点也都要满足特性一

    可以有下面的解决方式

    • 设定一个高度函数,返回每一个节点中的左右子树的高度差h,这是一重遍历
    • 设定一个判断函数,判断,左右子树的高度h1,以及左节点的h2,右节点的h3,是否都满足小于等于1.这是第二重遍历

    自顶向下demo

    class Solution {
        public boolean isBalanced(TreeNode root) {
            if (root == null) {
                return true;
            } else {
                return Math.abs(height(root.left) - height(root.right)) <= 1 && isBalanced(root.left) && isBalanced(root.right);
            }
        }
    
        public int height(TreeNode root) {
            if (root == null) {
                return 0;
            } else {
                return Math.max(height(root.left), height(root.right)) + 1;
            }
        }
    }
    

    自底向上

    优化一下,可以采用转变高度差的方式。不满足的条件的节点换一种方式让上层节点明白下层节点不行

    • 如果左右子节点高度差小于等于0,返回-1作为标志,令上一层节点知道此路不通。依次遍历即可完成任务

    只需要一重遍历便可

    自底向下demo

    class Solution {
        public boolean isBalanced(TreeNode root) {
            return height(root) >= 0;
        }
    
        public int height(TreeNode root) {
            if (root == null) {
                return 0;
            }
            int leftHeight = height(root.left);
            int rightHeight = height(root.right);
            if (leftHeight == -1 || rightHeight == -1 || Math.abs(leftHeight - rightHeight) > 1) {
                return -1;
            } else {
                return Math.max(leftHeight, rightHeight) + 1;
            }
        }
    }
    
    
  • 相关阅读:
    终于找到了一本PYTHON的中文书籍
    深圳测试协会第二次活动顺利举行
    Peer review
    如何在LINUX/UNIX上运行PYTHON程序
    CMMI各级关注的过程域(原创)
    深圳测试协会第三次活动顺利结束
    深圳测试沙龙第二期活动园满结束
    51testing软件测试沙龙
    sql中使用游标
    关于Asp.net 页面动态加载用户控件,出现“未能加载视图状态”的原因[续]
  • 原文地址:https://www.cnblogs.com/Di-iD/p/13784836.html
Copyright © 2020-2023  润新知