剑指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;
    }
}

 

 

posted @ 2020-08-24 21:20  不学无墅_NKer  阅读(197)  评论(0编辑  收藏  举报