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
0or1.
- 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