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;
        }
    }
  • 相关阅读:
    智能算法浅介模拟退火,遗传算法,禁忌搜索,神经网络等
    shell 字符串操作(长度,查找,替换)详解
    如何实现两个文件相减的功能(剔除)
    shell数值操作(四则运算,浮点数,科学计数法)awk,bc
    CUDA程序优化的记录
    随机化算法模拟退火
    (转)AspNetPager 样式以及使用(漂亮)
    (转)做项目时,如何做比较美观大方的数据输入窗体
    (转)26个Jquery使用小技巧(jQuery tips, tricks & solutions)
    (转)【译】Asp.net MVC并不仅仅只是Linq to SQL
  • 原文地址:https://www.cnblogs.com/HuangYJ/p/13555637.html
Copyright © 2011-2022 走看看