Swap zero value of a node with non-zero value of one of its descendants so that no node with value zero could be parent of node with non-zero.
Solution:
We use a postorder traversal of the tree where instead of sinking we rise the leafs, we keep the nodes that we are sure that have not a zero ancestor.public void sink0(TreeNode root)
{
HashSet<TreeNode> finished = new HashSet<TreeNode>();
sink0(root, new HashMap<TreeNode,TreeNode>(), finished, false);
}
public void sink0(TreeNode root, HashMap<TreeNode, TreeNode> parentMap, HashSet<TreeNode> finished, boolean zerosOver)
{
if(root.val==0)
zerosOver = true;
if(!zerosOver)
finished.add(root);
if(root.left != null)
{
parentMap.put(root.left, root);
sink0(root.left, parentMap, finished, zerosOver);
}
if(root.right != null)
{
parentMap.put(root.right, root);
sink0(root.right, parentMap, finished, zerosOver);
}
if(root.val!=0 && !finished.contains(root))
{
TreeNode temp = root;
ArrayDeque<TreeNode> nonZeroNodes = new ArrayDeque<TreeNode>();
ArrayDeque<TreeNode>nodes = new ArrayDeque<TreeNode>();
while(temp!=null && !finished.contains(temp))
{
nodes.push(temp);
if(temp.val!=0)
nonZeroNodes.push(temp);
temp = parentMap.get(temp);
}
while(!nonZeroNodes.isEmpty())
{
TreeNode tempNode = nonZeroNodes.pop();
TreeNode toModify = nodes.pop();
toModify.val = tempNode.val;
finished.add(toModify);
}
while(!nodes.isEmpty())
{
TreeNode toModify = nodes.pop();
toModify.val=0;
}
}
}
No comments :
Post a Comment