zoukankan      html  css  js  c++  java
  • 剑指39.平衡二叉树

    题目描述

    输入一棵二叉树,判断该二叉树是否是平衡二叉树。
     
    在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树
     

    思路

    平衡二叉树:每个节点左右子树高度相差不超过1。
     
    思路1:最直接的做法,遍历每个结点,借助一个获取树深度的递归函数,根据该结点的左右子树高度差判断是否平衡,然后递归地对左右子树进行判断。
                 思路1的缺点是在判断上层节点时,会多次重复遍历下层节点,增加了不必要的开销。
                                                           
    思路2(剪枝):从下往上遍历(后序遍历),如果子树是平衡二叉树,则返回子树的高度;如果发现子树不是平衡二叉树,则直接停止遍历,这样至多对每个节点访问一次.(加剪枝,就是最优解啦~)
     

    解法1

    public class Solution {
        public boolean IsBalanced_Solution(TreeNode root) {
            if (root == null)  // 返回true哦
                return true;
            int leftDepth = treeDepth(root.left);
            int rightDepth = treeDepth(root.right);
            int diff = Math.abs(leftDepth - rightDepth);
            if (diff > 1) return false;   // 要返回一个和递归终止条件相反的结果
            return IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right);
        }
        // 获取二叉树的深度
        private int treeDepth(TreeNode root){
            if (root == null) return 0;
            int left = treeDepth(root.left);
            int right = treeDepth(root.right);
            return Math.max(left,right) + 1;
        }
    }

    ☆☆解法2

    //如果不平衡,则令树的深度=-1,用来表示树不平衡。最终根据树的深度是否等于-1来确定是否为平衡树。
    //在判断出树不平衡后,进行剪枝(即代码中直接返回-1,不再对其他子树进行判断),以提高效率。
    public class Solution {
        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 : Math.max(left,right) + 1;
        }
    }
  • 相关阅读:
    医学影像分割之HIP
    c++画分形之Julia集与Mandelbrot集
    趣题一道
    华山论剑常用角点检测与角点匹配方法比较
    改变鼠标样式
    Unity3D Pro 利用摄像头产生俯视地图效果
    unity3D小地图教程
    WebBrowser网址中特殊字符的问题
    打开多个unity3D项目 (项目多开)
    u3d按住鼠标右键才转动摄像机的方法
  • 原文地址:https://www.cnblogs.com/HuangYJ/p/13555637.html
Copyright © 2011-2022 走看看