用时:15min
用时:15min
拿到题的第一反应是是用递归,然后直接开始写了后发现
递归需要满足的条件是问题可以拆分成子问题,但是根据题意,我们需要求的是每个节点左右节点和的差值,这个 “左右节点和” 对于每个节点来说,都是不一样的问题
所以还是双递归
var findTilt = function(root) {
var total = 0 var innerDFS = function (root) {
if (!root) return 0 var left = 0 ,right = 0 if (root.left) {
left = innerDFS(root.left)
}
if (root.right) {
right = innerDFS(root.right)
}
return root.val + left + right
}
var outerDFS = function (root) {
if (!root) return root.right && outerDFS(root.right)
total += Math.abs(innerDFS(root.left) - innerDFS(root.right))
root.left && outerDFS(root.left)
}
outerDFS(root)
return total
};But!!!!!!!!
看了一眼答案我觉得自己还是拿衣服了
原来计算左右节点之和,与累积左右节点只差并不矛盾,一个递归就能解决问题。就是DFS的时候顺便两者一起做了,累计左右节点就是 return root.val + left + right 而计算差值是 total += Math.abs(left-right)
var findTilt = function(root) {
var total = 0 var DFS = function (root) {
if (!root) return 0 var left = 0 ,right = 0 if (root.left) {
left = DFS(root.left)
}
if (root.right) {
right = DFS(root.right)
}
total += Math.abs(left-right)
return root.val + left + right
}
DFS(root)
return total
};还是年轻了,明明做过类似的递归