说实话,递归+回溯很简单,也很难,这句话是我感受最深的一句话,有时候脑子里面很简单的递归,实现出来好麻烦,下面我们说一下,树的递归,三种遍历应该牢记于心了,但是遇到具体问题怎么去解决呢,列出题目:
感觉很好做,就是每个节点都运行一次左子树的值减去右子树的值的绝对值相加就行了,但是我们这道题,我从头开始,我们如果使用递归会遇到什么问题呢?就是我们需要计算每个节点左右子树的值,那么就会有一定的困扰了,我们不妨多想想,从下往上进行递归,我们最后一层的节点一定是 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;
}