package com.interview.tree; /** * http://www.careercup.com/question?id=5344154741637120 */ public class SinkNegativeToBottom { public void sinkZero(Node root) { if (root == null) { return; } sinkZero(root.left); sinkZero(root.right); if (root.data < 0) { pushDown(root); } } private void pushDown(Node root) { if(root == null){ return; } // find a child with non zero node value if (root.left == null && root.right == null) { // already leaf node. nothing to do. just return return; } //if root left is not null and root left data is not 0 pick it to swap if (root.left != null && root.left.data >= 0) { int temp = root.data; root.data = root.left.data; root.left.data = temp; pushDown(root.left); } else if(root.right != null && root.right.data >= 0){ int temp = root.data; root.data = root.right.data; root.right.data = temp; pushDown(root.right); } } public static void main(String args[]){ int preorder[] = {-1,1,6,-2,11,3,2,-3,31,22,17}; int inorder[] = {-2,6,11,1,3,-1,31,-3,22,2,17}; ConstructTreeFromInOrderPreOrder ctf = new ConstructTreeFromInOrderPreOrder(); Node root = ctf.createTree(inorder, preorder); SinkNegativeToBottom szb = new SinkNegativeToBottom(); szb.sinkZero(root); LevelOrderTraversal lot = new LevelOrderTraversal(); TreeTraversals tt = new TreeTraversals(); tt.inOrder(root); lot.levelOrder(root); } }