Binary Tree Pruning

Love this kind of tree problem: https://leetcode.com/problems/binary-tree-pruning/description/

We are given the head node root of a binary tree, where additionally every node's value is either a 0 or a 1.
Return the same tree where every subtree (of the given tree) not containing a 1 has been removed.
(Recall that the subtree of a node X is X, plus every node that is a descendant of X.)
Example 1:
Input: [1,null,0,0,1]
Output: [1,null,0,null,1]
 
Explanation: 
Only the red nodes satisfy the property "every subtree not containing a 1".
The diagram on the right represents the answer.


Example 2:
Input: [1,0,1,0,0,0,1]
Output: [1,null,1,null,1]



Example 3:
Input: [1,1,0,1,1,0,1,0]
Output: [1,1,0,1,1,null,1]



Note:
  • The binary tree will have at most 100 nodes.
  • The value of each node will only be 0 or 1.
Simple recursion:

  • Use post-order traversal (either left-right-parent or right-left-parent)
  • Use a ref variable t o indicate whether the current node needs to be pruned
  • Prune the children if needed
  • Before calling the recursion though, there is a special case when the tree only has the root and the root val itself is zero
That's it, thanks, ACC.


public class Solution
{
 public TreeNode PruneTree(TreeNode root)
 {
  if (root == null) return null;
  if (root.left == null && root.right == null && root.val == 0) return null;

  bool containsOne = false;
  Process(ref root, ref containsOne);
  return root;
 }

 private void Process(ref TreeNode node, ref bool containsOne)
 {
  if (node == null) return;

  bool containsOneRight = false;
  Process(ref node.right, ref containsOneRight);
  bool containsOneLeft = false;
  Process(ref node.left, ref containsOneLeft);

  containsOne = (containsOneRight || containsOneLeft || node.val == 1);
  if (!containsOneRight) node.right = null;
  if (!containsOneLeft) node.left = null;
 }
}

Comments

  1. There is actually no need to track whether subtree contains 1s or not - if we maintain the invariant that if a child is present that its subtree contains 1, we can make local decisions based on node's children and its value. For this awesome problem I decided to use C:

    struct TreeNode* pruneTree(struct TreeNode* root) {
    if (!root) return root;
    root->left = pruneTree(root->left);
    root->right = pruneTree(root->right);
    return (!root->val && !root->left && !root->right) ? NULL : root;
    }

    https://gist.github.com/ttsugriy/dbaa1124468825788e4f673af6c929ee

    ReplyDelete

Post a Comment

Popular posts from this blog

Golang vs. C#: performance characteristics (simple case study)

Claude vs ChatGPT: A Coder's Perspective on LLM Performance

ProjectEuler Problem 719 (some hints, but no spoilers)