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
or1
.
- 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; } }
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:
ReplyDeletestruct 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
Thanks For Shareing ! then jest Visit HereTree Pruning In Pennant Hills
ReplyDelete