剑指offer-39-平衡二叉树 -- Java实现

题目

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

分析

思路一:

平衡二叉树:所有节点的左右子树深度相差不超过1
直接利用一个寻找二叉树深度的函数,分别判断左右子树的深度之差不超过1,如果每个节点都符合这样的规律,那么它就是一个平衡二叉树。

在这里插入图片描述

时间复杂度:o(N)
空间复杂度:o(N)

代码:

public class Solution {
    public boolean IsBalanced_Solution(TreeNode root) {
        if(root==null) return true;
        int left = TreeDepth(root.left);
        int right = TreeDepth(root.right);
        if((left-right)>1||(left-right)<-1) return false;
        return IsBalanced_Solution(root.left)&&IsBalanced_Solution(root.right);
    }
    
    private int TreeDepth(TreeNode root){
        if(root==null) return 0;
        int nLeft = TreeDepth(root.left);
        int nRight = TreeDepth(root.right);
        return nLeft>nRight?(nLeft+1):(nRight+1);
    }
}

思路二:

第一种方法可以看到首先我们判断根节点(1)是否平衡,此时会遍历4、5、7,然后当判断左子树根节点(2)时,又会遍历4、5、7,这种重复遍历显然我们是不想遇到的。所以我们改变思路,从下向上遍历,如果子树不是平衡二叉树,直接返回-1表示非二叉树,如果子树是则返回高度继续遍历。这样我们就只遍历一次节点。

时间复杂度:o(N)
空间复杂度:o(N)

代码:

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:1+Math.max(left,right);
    }
}
发布了46 篇原创文章 · 获赞 17 · 访问量 1021

猜你喜欢

转载自blog.csdn.net/weixin_42054926/article/details/103609655