563. 二叉树的坡度 递归的使用

说实话,递归+回溯很简单,也很难,这句话是我感受最深的一句话,有时候脑子里面很简单的递归,实现出来好麻烦,下面我们说一下,树的递归,三种遍历应该牢记于心了,但是遇到具体问题怎么去解决呢,列出题目:

感觉很好做,就是每个节点都运行一次左子树的值减去右子树的值的绝对值相加就行了,但是我们这道题,我从头开始,我们如果使用递归会遇到什么问题呢?就是我们需要计算每个节点左右子树的值,那么就会有一定的困扰了,我们不妨多想想,从下往上进行递归,我们最后一层的节点一定是   left-right的绝对值,

为了不让子树结点之和被重复计算,我们应该向上返回当前树的所有节点之和。
也就是当一个结点得到了子结点向上返回的结点之和时,立即计算该节点的坡度,可存储在一个实例变量中,然后同样也向上返回当前结点作为根结点的树的所有节点之和。
如此这般在自底向上的过程中,不断返回子树的所有节点之和,然后计算并累加当前结点的坡度,再向上返回当前树的结点之和。直到根结点的坡度得到计算后,递归遍历结束,所有节点的坡度之和就出来了。

下面我们列出代码:

        int tilt=0;
        public int findTilt(TreeNode root) {
            traverse(root);
            return tilt;
        }
        public int traverse(TreeNode root)
        {
            if(root==null )
                return 0;
            int left=traverse(root.left);
            int right=traverse(root.right);
            tilt+=Math.abs(left-right);
            return left+right+root.val;
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值