zoukankan      html  css  js  c++  java
  • 剑指offer 39.知识迁移能力 平衡二叉树

    题目描述

    输入一棵二叉树,判断该二叉树是否是平衡二叉树。
     

    解题思路

    /后续遍历二叉树,遍历过程中求子树高度,判断是否平衡
     

    代码如下

    public boolean IsBalanced_Solution(TreeNode root) {
                    return getDepth(root) != -1;
                }
                 
                private int getDepth(TreeNode root) {
                    if (root == null) return 0;
                    int left = getDepth(root.left);
                    if (left == -1) return -1;
                    int right = getDepth(root.right);
                    if (right == -1) return -1;
                    return Math.abs(left - right) > 1 ? -1 : 1 + Math.max(left, right);
                }

     平衡二叉树简介

    定义

    平衡二叉树也叫自平衡二叉搜索树(Self-Balancing Binary Search Tree),所以其本质也是一颗二叉搜索树,不过为了限制左右子树的高度差,避免出现倾斜树等偏向于线性结构演化的情况,所以对二叉搜索树中每个节点的左右子树作了限制,左右子树的高度差称之为平衡因子,树中每个节点的平衡因子绝对值不大于 1,此时二叉搜索树称之为平衡二叉树。

    自平衡是指,在对平衡二叉树执行插入或删除节点操作后,可能会导致树中某个节点的平衡因子绝对值超过 1,即平衡二叉树变得“不平衡”,为了恢复该节点左右子树的平衡,此时需要对节点执行旋转操作。

    情景分析

    在执行插入或删除节点操作后,平衡因子绝对值变为大于 1 的情况,即左右子树的高度差为 -22 的情况,可以归纳为如下四种:

    • 左左情况(LL)

    LL 情况是指根节点的平衡因子为 2,根节点的左子节点平衡因子为 01

     
    LL_1

    如图 LL_1 所示,当节点 C 的子节点被删除,或者节点 D 插入子节点 F 时,根节点 A 的平衡因子变为 2A 的左子节点 B 的平衡因子为 1

     
    LL_2

    或者如图 LL_2 所示,当节点 C 的子节点被删除,根节点 A 的平衡因子变为 2A 的左子节点 B 的平衡因子为 0

    当根节点的左子树高度比右子树的高度大 2,因为平衡二叉树是一种有序结构,节点值之间具有大小关系,所以如果根节点保持不变,左右子树始终分隔两岸,则无论如何调整节点位置,二叉树始终不可能恢复平衡。所以需要更换根节点,使得新的根节点的左右子树的高度趋于平衡。

    该情况下需要对平衡二叉树执行右旋操作:

    1. 设置根节点 root 的左子节点为新的根节点 root_{new}
    2. root_{new} 节点的右子树作为 root 节点的左子树,将 root 节点作为 root_{new} 的右子树,即降低“左子树”高度,提升“右子树”高度,使得新的左右子树高度趋于平衡;

    对于图 LL_1,节点 B 的平衡因子为 1,设 B 节点的左子树 D 高度为 h,则右子树 E 高度为h-1,因为 A 的平衡因子为 2,所以二叉树 C 的高度为: h-1。则右旋操作后,B 的左子树高度不变为 h,右子树高度为:1+max(height(C),height(E))=h,此时二叉树为平衡二叉树,如下图 balanced_LL_1

     
    balanced_LL_1

    对于图 LL_2,节点 B 的平衡因子为 0,设 B 节点的左右子树高度为 h,则二叉树 C 的高度为: h-1。右旋操作后,B 的左子树高度不变为 h,右子树高度为:1+max(height(C),height(E))=h+1,此时二叉树为平衡二叉树,如下图 balanced_LL_2

     
    balanced_LL_2
    • 右右情况(RR)

    该情况与上面的左左情况具有对称性,对平衡二叉树执行插入或删除节点操作后,根节点的平衡因子变为 -2,根节点的右子节点平衡因子为 -10,为了恢复二叉树的平衡,需要进行左旋,来使得新的左右子树高度区域平衡。

     
    RR

    如上图 RR 所示,该情况下需要对平衡二叉树执行左旋操作:

    1. 设置根节点 root 的右子节点为新的根节点 root_{new}
    2. root_{new} 节点的左子树作为 root 节点的右子树,将 root 节点作为 root_{new} 的左子树,即降低“右子树”高度,提升“左子树”高度,使得新的左右子树高度趋于平衡;

    左旋操作后,平衡二叉树如图 balanced_RR 所示。

     
    balanced_RR
  • 相关阅读:
    Invoice Helper
    Product Helper
    Order Helper
    Case Helper
    Quote Helper
    C# 工厂模式示例
    若今生长剑浣花,生死无涯
    古代美到窒息的谎言
    C#解决微信支付Exception has been thrown by the target of an invocation(调用的目标发生了异常)的问题
    文能提笔控萝莉,转载自网上
  • 原文地址:https://www.cnblogs.com/Transkai/p/11309023.html
Copyright © 2011-2022 走看看