Skip to main content

Binary Tree Tilt

LeetCode 563 | Difficulty: Easy​

Easy

Problem Description​

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.

Example 1:

Input: root = [1,2,3]
Output: 1
Explanation:
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 is 2; right subtree is just right child, so sum is 3)
Sum of every tilt : 0 + 0 + 1 = 1

Example 2:

Input: root = [4,2,9,3,5,null,7]
Output: 15
Explanation:
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 is 3; right subtree is just right child, so sum is 5)
Tilt of node 9 : |0-7| = 7 (no left child, so sum is 0; right subtree is just right child, so sum is 7)
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

Example 3:

Input: root = [21,7,14,1,1,2,2,3,3]
Output: 9

Constraints:

- The number of nodes in the tree is in the range `[0, 10^4]`.

- `-1000 <= Node.val <= 1000`

Topics: Tree, Depth-First Search, Binary Tree


Approach​

Tree DFS​

Traverse the tree recursively (or with a stack). At each node, decide: what information do I need from the left/right subtrees? Process: go left β†’ go right β†’ combine results. Consider preorder, inorder, or postorder traversal based on when you need to process the node.

When to use

Path problems, subtree properties, tree structure manipulation.


Solutions​

Solution 1: C# (Best: 157 ms)​

MetricValue
Runtime157 ms
Memory28.7 MB
Date2021-10-01
Solution
/**
* Definition for a binary tree node.
* public class TreeNode {
* public int val;
* public TreeNode left;
* public TreeNode right;
* public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
public class Solution {
public int result = 0;
public int FindTilt(TreeNode root) {
NodeSum(root);
return result;
}

public int NodeSum(TreeNode root)
{
if(root == null)
{
return 0;
}
int leftSum = root.left != null ? NodeSum(root.left) : 0;
int rightSum = root.right != null ? NodeSum(root.right) : 0;
result += Math.Abs(leftSum - rightSum);
return leftSum + rightSum + root.val;
}
}
πŸ“œ 2 more C# submission(s)

Submission (2021-10-01) β€” 168 ms, 28.9 MB​

/**
* Definition for a binary tree node.
* public class TreeNode {
* public int val;
* public TreeNode left;
* public TreeNode right;
* public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
public class Solution {
public int FindTilt(TreeNode root) {
int result = 0;
NodeSum(root, ref result);
return result;
}

public int NodeSum(TreeNode root, ref int result)
{
if(root == null)
{
return 0;
}
int leftSum = root.left != null ? NodeSum(root.left, ref result) : 0;
int rightSum = root.right != null ? NodeSum(root.right, ref result) : 0;
result += Math.Abs(leftSum - rightSum);
return leftSum + rightSum + root.val;
}
}

Submission (2021-10-01) β€” 186 ms, 28.8 MB​

/**
* Definition for a binary tree node.
* public class TreeNode {
* public int val;
* public TreeNode left;
* public TreeNode right;
* public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
public class Solution {
public int FindTilt(TreeNode root) {
List<int> result = new List<int>();
NodeSum(root, result);
return result.Sum();
}

public int NodeSum(TreeNode root, List<int> result)
{
if(root == null)
{
return 0;
}
int leftSum = root.left != null ? NodeSum(root.left, result) : 0;
int rightSum = root.right != null ? NodeSum(root.right, result) : 0;
result.Add(Math.Abs(leftSum-rightSum));
return leftSum + rightSum + root.val;
}
}

Complexity Analysis​

ApproachTimeSpace
Tree Traversal$O(n)$$O(h)$

Interview Tips​

Key Points
  • Start by clarifying edge cases: empty input, single element, all duplicates.
  • Consider: "What information do I need from each subtree?" β€” this defines your recursive return value.
  • LeetCode provides 4 hint(s) for this problem β€” try solving without them first.
πŸ’‘ Hints

Hint 1: Don't think too much, this is an easy problem. Take some small tree as an example.

Hint 2: Can a parent node use the values of its child nodes? How will you implement it?

Hint 3: May be recursion and tree traversal can help you in implementing.

Hint 4: What about postorder traversal, using values of left and right childs?