Skip to content

Instantly share code, notes, and snippets.

@rfaisal
Created November 11, 2013 16:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rfaisal/7416435 to your computer and use it in GitHub Desktop.
Save rfaisal/7416435 to your computer and use it in GitHub Desktop.
public class BTLeavesToDLL {
public static TNode<Integer> getLeaves(TNode<Integer> root){
if(root==null){
return null;
}
if(isLeaf(root)){
return root;
}
else{
TNode<Integer> left=getLeaves(root.left);
if(left!=null){
TNode<Integer> temp=left;
while(temp.right!=null) temp=temp.right;
temp.right=getLeaves(root.right);
if(temp.right != null){//boundary
temp.right.left=temp;
}
return left;
}
else{//boundary
return getLeaves(root.right);
}
}
}
public static TNode<Integer> getLeavesAndTrimOriginal(TNode<Integer> root){
return getLeavesAndTrimOriginalRec(root,null,false);
}
private static TNode<Integer> getLeavesAndTrimOriginalRec(TNode<Integer> root,TNode<Integer> parent,boolean isLeftChild){
if(root==null){
return null;
}
if(isLeaf(root)){
if(parent!=null){
if(isLeftChild) parent.left=null;
else parent.right=null;
}
return root;
}
else{
TNode<Integer> left=getLeavesAndTrimOriginalRec(root.left,root,true);
if(left!=null){
TNode<Integer> temp=left;
while(temp.right!=null) temp=temp.right;
temp.right=getLeavesAndTrimOriginalRec(root.right,root,false);
if(temp.right != null){//boundary
temp.right.left=temp;
}
return left;
}
else{//boundary
return getLeavesAndTrimOriginalRec(root.right,root,false);
}
}
}
private static boolean isLeaf(TNode<Integer> root){
if(root==null) return false; //if it is not a node it is not a leaf
else return root.left == null && root.right==null;
}
}
public class BTLeavesToDLLTest {
@Test
public void testGetLeaves() {
TNode<Integer> r= new TNode<Integer>(20);
r.left= new TNode<Integer>(8);
r.left.left= new TNode<Integer>(4);
r.left.right= new TNode<Integer>(12);
r.left.right.left= new TNode<Integer>(10);
r.left.right.right= new TNode<Integer>(14);
r.right= new TNode<Integer>(22);
r.right.right= new TNode<Integer>(25);
TNode<Integer> leaves=BTLeavesToDLL.getLeaves(r);
assertEquals(new Integer(4), leaves.data);
assertEquals(new Integer(10), leaves.right.data);
assertEquals(new Integer(14), leaves.right.right.data);
assertEquals(new Integer(25), leaves.right.right.right.data);
assertEquals(new Integer(14), leaves.right.right.right.left.data);
assertEquals(new Integer(10), leaves.right.right.right.left.left.data);
assertEquals(new Integer(4), leaves.right.right.right.left.left.left.data);
}
@Test
public void testGetLeavesAndTrimOriginal() {
TNode<Integer> r= new TNode<Integer>(20);
r.left= new TNode<Integer>(8);
r.left.left= new TNode<Integer>(4);
r.left.right= new TNode<Integer>(12);
r.left.right.left= new TNode<Integer>(10);
r.left.right.right= new TNode<Integer>(14);
r.right= new TNode<Integer>(22);
r.right.right= new TNode<Integer>(25);
TNode<Integer> leaves=BTLeavesToDLL.getLeavesAndTrimOriginal(r);
assertEquals(new Integer(4), leaves.data);
assertEquals(new Integer(10), leaves.right.data);
assertEquals(new Integer(14), leaves.right.right.data);
assertEquals(new Integer(25), leaves.right.right.right.data);
assertEquals(new Integer(14), leaves.right.right.right.left.data);
assertEquals(new Integer(10), leaves.right.right.right.left.left.data);
assertEquals(new Integer(4), leaves.right.right.right.left.left.left.data);
assertEquals(new Integer(8), r.left.data);
assertEquals(new Integer(22), r.right.data);
assertEquals(new Integer(12), r.left.right.data);
assertNull(r.left.left);
assertNull(r.left.right.left);
assertNull(r.left.right.right);
assertNull(r.right.right);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment