算法题目:平衡二叉树

思路:本来,我看到这道题目的第一想法的遍历二叉树,然后计算每个节点的高度。我当时的想法就很简单,前序遍历并且计算,但是仔细一想这样会产生大量的重复计算,感觉题目这样子解不太好。当时看了一下题目的评论,看到了从底向上的计算方式,的确后序遍历只需要计算一次,比前序遍历更加简洁和快速。

以下是我手画的后序遍历思路图:

如下是代码及说明:

public class Main {
    public static void main(String[]args){

        Solution solution = new Solution();
        //简单粗暴的测试用例 ╰( ̄▽ ̄)╮
        TreeNode root = new TreeNode(1);
        TreeNode lNode2 = new TreeNode(2);
        TreeNode rNode2 = new TreeNode(2);
        TreeNode lNode3 = new TreeNode(3);
        TreeNode rNode3 = new TreeNode(3);
        TreeNode lNode4 = new TreeNode(4);
        TreeNode rNode4 = new TreeNode(4);
        lNode3.left = lNode4;
        lNode3.right = rNode4;
        lNode2.left = lNode3;
        lNode2.right = rNode3;
        root.left = lNode2;
        root.right = rNode2;
        boolean f = solution.isBalanced(root);
        System.out.println(f);

    }
}

class TreeNode {
  int val;
  TreeNode left;
  TreeNode right;
  TreeNode(int x) { val = x; }
}
//使用后序遍历 从底部开始往上计算,只需要遍历一次即可完成计算。
class Solution {
    public int f = 0;
    public boolean isBalanced(TreeNode root) {
        lrd(root);
        return f <= 1;
    }
    //后序遍历
    public int lrd(TreeNode root) {
        if(root==null) {
            return 0;
        }
        int l = 0;
        int r = 0;
        //使用递归,到达底部,然后递归至根节点
        if(root.left!=null) {
            //获取当前节点高度
            l = lrd(root.left);
        }
        if(root.right!=null) {
            r = lrd(root.right);
        }
        //每个节点计算左右差值,如果大于当前最大差值,则记录
        int lr = Math.abs(l - r);
        if(lr > f) {
            f = lr;
        }
        //将当前树的高度+1,返回给父节点,告知父节点高度
        return Math.max(l, r) + 1;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值