Given the root of a binary tree, return the sum of every tree node ’s tilt.
The tilt of a tree node is the absolute difference between the sum of all left subtree node values and all right subtree node values. If a node does not have a left child, then the sum of the left subtree node values is treated as 0. The rule is similar if the node does not have a right child.
Input: root =[1,2,3]Output: 1Explanation:
Tilt of node 2:|0-0|=0(no children)Tilt of node 3:|0-0|=0(no children)Tilt of node 1:|2-3|=1(left subtree is just left child, so sum is2; right subtree is just right child, so sum is3)Sum of every tilt :0+0+1=1
Input: root =[4,2,9,3,5,null,7]Output: 15Explanation:
Tilt of node 3:|0-0|=0(no children)Tilt of node 5:|0-0|=0(no children)Tilt of node 7:|0-0|=0(no children)Tilt of node 2:|3-5|=2(left subtree is just left child, so sum is3; right subtree is just right child, so sum is5)Tilt of node 9:|0-7|=7(no left child, so sum is0; right subtree is just right child, so sum is7)Tilt of node 4:|(3+5+2)-(9+7)|=|10-16|=6(left subtree values are 3,5, and 2, which sums to 10; right subtree values are 9 and 7, which sums to 16)Sum of every tilt :0+0+0+2+7+6=15
To compute the tilt for each node, we need the sum of values in its left and right subtrees. A postorder DFS allows us to compute subtree sums and node tilts efficiently in one pass.
classTreeNode {
int val;
TreeNode left, right;
TreeNode(int x) { val = x; }
}
classSolution {
int ans = 0;
intdfs(TreeNode node) {
if (node ==null) return 0;
int l = dfs(node.left);
int r = dfs(node.right);
ans += Math.abs(l - r);
return l + r + node.val;
}
publicintfindTilt(TreeNode root) {
dfs(root);
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
dataclassTreeNode(var `val`: Int, var left: TreeNode? = null, var right: TreeNode? = null)
classSolution {
var ans = 0fundfs(node: TreeNode?): Int {
if (node ==null) return0val l = dfs(node.left)
val r = dfs(node.right)
ans += kotlin.math.abs(l - r)
return l + r + node.`val`
}
funfindTilt(root: TreeNode?): Int {
dfs(root)
return ans
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
classTreeNode:
def__init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
classSolution:
deffindTilt(self, root: TreeNode) -> int:
self.ans =0defdfs(node: TreeNode) -> int:
ifnot node:
return0 l = dfs(node.left)
r = dfs(node.right)
self.ans += abs(l - r)
return l + r + node.val
dfs(root)
return self.ans