BM36 题解 | #判断是不是平衡二叉树#

判断是不是平衡二叉树

https://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222

心路历程:

判断二叉树,本质是判断单个二叉树的深度,使用的是后序遍历的方法,如何判断前序,中序,后序?

与左右递归和root调用的位置,有返回值的情况有关:

* 前序:if(root)返回值->if(左递归)返回值->if(右递归)返回值

* 中序:if(左递归)返回值->if(root)返回值->if(右递归)返回值

* 后序:if(左递归)返回值->if(右递归)返回值->if(root)返回值

解题思路:

二叉树深度遍历算法:

其实,深度遍历递归的过程中本就可以知道左右子树的高度,

所以在递归过程中,就可以利用这个left、right值做比较的,通过返回值增加返回负值,

来表示非平衡二叉树的情况,再层层往上抛得出结果就可以了。

我们就可以立刻知道这个树是不是就是平衡二叉树了!

具体的返回值解析:

dep == -1, 表示非平衡二叉树;

dep > 0, 平衡二叉树的高度;

int dep = int deep(TreeNode root) {

....

// 下面这句话的意思是:

// Math.abs(left-right)>1, 左右子树高度相差>1,非平衡二叉树,返回-1

// 否则,返回 Math.max(left,right)+1, 也就是当前树节点的高度

return Math.abs(left-right)>1 ?-1: Math.max(left,right)+1;

}

import java.util.*;

public class Solution {
    /**
     *
     * @param pRoot TreeNode类 
     * @return bool布尔型
     */
    public boolean IsBalanced_Solution (TreeNode pRoot) {
        int dep = deep(pRoot);
        return dep<0?false:true;
    }

    /**
     * 深度探测是一种后序遍历二叉树的方法
     * 怎么算前、中、后?就可以递归嵌套递归时
     * 左右递归和root调用的位置,有返回值的情况
     *
     * 前序:if(root)返回值->if(左递归)返回值->if(右递归)返回值
     *
     * 中序:if(左递归)返回值->if(root)返回值->if(右递归)返回值
     *
     * 后序:if(左递归)返回值->if(右递归)返回值->if(root)返回值
     */
    int deep(TreeNode root) {
        if(root == null) {
            return 0;
        }
        int left = deep(root.left);
        if(left<0) {
            return -1;
        }
        int right = deep(root.right);
        if(right<0) {
            return -1;
        }
        return Math.abs(left-right)>1 ?-1: Math.max(left,right)+1;
    }
}
全部评论

相关推荐

点赞 评论 收藏
分享
Cherrycola01:0实习 0项目 约等于啥也没有啊 哥们儿这简历认真的吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务