Creating AVL Tree In Java

Friday 12 October 2012

 Complete implementation only without the delete method ... If anyone wants it i will post it later in the comments :


import java.io.*;
class Node
{
int data;
Node leftchild;
Node rightchild;
Node parent;
public Node(int d)
{
    data=d;
    leftchild=null;
    rightchild=null;
}
public int get_data()
{
    return data;
}
public Node get_leftchild()
{
    return leftchild;
}
public Node get_rightchild()
{
    return rightchild;
}
public void set_data(int d)
{
    data=d;
}
public void set_leftchild(Node n)
{
    leftchild=n;
}
public void set_rightchild(Node n)
{
    rightchild=n;
}
public void set_parent(Node n)
{
    parent=n;
}
public Node get_parent()
{
    return parent;
}
}

//end of the node class

//start
class Avl
{
Node root;
public Avl()
{
    root=null;
}

public int max(int a,int b)
{
    if(a>b)
    return a;
    else
    return b;
}

public int get_height(Node n)
{
    if(n==null)
    return 0;
    else
    return max(get_height(n.get_leftchild()),get_height(n.get_rightchild()))+1;
}

public void left_left_rot(Node k2)
{
    Node k1=k2.get_leftchild();
    Node B=k1.get_rightchild();
    Node gp=k2.get_parent();
    if(gp!=null)
    {
        if(gp.get_rightchild()==k2)
        {
            gp.set_rightchild(k1);
            k1.set_parent(gp);
        }
        else
        {
            gp.set_leftchild(k1);
            k1.set_parent(gp);
        }
    }
    else
    {
    k1.set_parent(null);
    }
    k1.set_rightchild(k2);
    if(k1!=null)
    k2.set_parent(k1);
    k2.set_leftchild(B);
    if(B!=null)
    B.set_parent(k2);
}

public void right_right_rot(Node x)
{
    Node y=x.get_rightchild();
    Node B=y.get_leftchild();
    Node gp=x.get_parent();
    if(gp.get_rightchild()==x)
    {
        gp.set_rightchild(y);
        y.set_parent(gp);
        }
    else
    {
        gp.set_leftchild(y);
        y.set_parent(gp);
    }
    y.set_leftchild(x);
    x.set_parent(y);
    x.set_rightchild(B);
    if(B!=null)
    B.set_parent(x);
}

public void left_right_rot(Node k3)
{
    Node k1=k3.get_leftchild();
    Node k2=k1.get_rightchild();
    Node B=k2.get_leftchild();
    Node C=k2.get_rightchild();
    Node par=k3.get_parent();
    if(par.get_leftchild()==k3)
    par.set_leftchild(k2);
    else
    par.set_rightchild(k2);
    if(k2!=null)
    k2.set_parent(par);
    k2.set_leftchild(k1);
    if(k1!=null)
    k1.set_parent(k2);
    k2.set_rightchild(k3);
    if(k3!=null)
    k3.set_parent(k2);
    k1.set_rightchild(B);
    k3.set_leftchild(C);
    if(B!=null)
    B.set_parent(k1);
    if(C!=null)
    C.set_parent(k3);
}

public void right_left_rot(Node k1)
{
    Node k3=k1.get_rightchild();
    Node k2=k3.get_leftchild();
    Node C=k2.get_rightchild();
    Node B=k2.get_leftchild();
    Node par=k1.get_parent();
    if(par.get_leftchild()==k1)
    par.set_leftchild(k2);
    else
    par.set_rightchild(k2);
    if(k2!=null)
    k2.set_parent(par);
    k2.set_rightchild(k3);
    k2.set_leftchild(k1);
    if(k3!=null)
    k3.set_parent(k2);
    if(k1!=null)
    k1.set_parent(k2);
    k1.set_rightchild(B);
    k3.set_leftchild(C);
    if(B!=null)
    B.set_parent(k1);
    if(C!=null)
    C.set_parent(k3);
}
   

public int balance_factor(Node n)
{
    Node n1=n.get_rightchild();
    Node n2=n.get_leftchild();
    int h1,h2;
    h1=get_height(n1);
    h2=get_height(n2);
    return (h2-h1);
}
public Node returnUnbalanced(Node n)
{
    Node unbal=null;
    int checkflag=1;
    if(get_height(n.get_parent())==1)
    return unbal;
    int bf;
    while(n.get_parent()!=null)
    {
        n=n.get_parent();
        bf=balance_factor(n);
        if(checkflag==1)
        if((bf==2)||(bf==-2))
        {
            unbal=n;
            checkflag=0;
        }
    }
    return unbal;
}


   
public void insert(Node n,Node bs)
{
    if(bs==null)
    {
        root=n;
    }
    else
    {
        if(bs.get_data()>n.get_data())
        {
            if(bs.get_leftchild()==null)
            {
                bs.set_leftchild(n);
                n.set_parent(bs);
                Node unbal=returnUnbalanced(n);
                if(unbal!=null)
                {//balance it
                    int bf=balance_factor(unbal);
                    System.out.println("node ::"+unbal.get_data());
                    if(bf==2)
                    {
                        int bf2=balance_factor(unbal.get_leftchild());
                        if(bf2==1)
                        left_left_rot(unbal);
                        if(bf2==-1)
                        left_right_rot(unbal);
                    }
                    if(bf==-2)
                    {
                        int bf2=balance_factor(unbal.get_rightchild());
                        if(bf2==1)
                        right_left_rot(unbal);
                        if(bf2==-1)
                        right_right_rot(unbal);
                    }
                }
            }
            else
            insert(n,bs.get_leftchild());
        }
        else
        {
            if(bs.get_rightchild()==null)
            {
                bs.set_rightchild(n);
                n.set_parent(bs);
                Node unbal=returnUnbalanced(n);
                if(unbal!=null)
                {//perform the req bal op
                    int bf=balance_factor(unbal);
                    System.out.println("node::"+unbal.get_data());
                    if(bf==2)
                    {
                        int bf2=balance_factor(unbal.get_leftchild());
                        if(bf2==1)
                        left_left_rot(unbal);
                        if(bf2==-1)
                        left_right_rot(unbal);
                    }
                    if(bf==-2)
                    {
                        int bf2=balance_factor(unbal.get_rightchild());
                        if(bf2==1)
                        right_left_rot(unbal);
                        if(bf2==-1)
                        right_right_rot(unbal);
                    }
                }
            }
            else
            insert(n,bs.get_rightchild());
        }
    }
}

public void search(int n,Node bs)
{
    if(bs==null)
    System.out.println("not present in tree");
    else
    {
        if(bs.get_data()==n)
        System.out.println("Node is present in Tree");
        else if(bs.get_data()>n)
             search(n,bs.get_leftchild());
             else
             search(n,bs.get_rightchild());
    }
}

public Node findmin(Node bs)
{
    if(bs!=null)
        while(bs.get_leftchild()!=null)
        bs=bs.get_leftchild();
    return bs;
}

public Node findmax(Node bs)
{
    if(bs!=null)
        while(bs.get_rightchild()!=null)
        bs=bs.get_rightchild();
    return bs;
}

public void del(int n,Node bs)
{
    if(bs==null)
    System.out.println("node not found in tree");
    else
    {
        if(bs.get_data()==n)
        {
        //do the three cases
            //case 1.Node has no children;
            if((bs.get_leftchild()==null)&&(bs.get_rightchild()==null))
            {
                Node par=bs.get_parent();
                if(par.get_rightchild()==bs)
                par.set_rightchild(null);
                else
                par.set_leftchild(null);
            }
            //case 2.if Node has 1 child
            else
            {
                if((bs.get_leftchild()==null)||(bs.get_rightchild()==null))
                {
                    //System.out.println("here");
                    Node par=bs.get_parent();
                    Node child;
                    if(bs.get_leftchild()==null)
                    child=bs.get_rightchild();
                    else
                    child=bs.get_leftchild();
                    if(par.get_leftchild()==bs)
                    par.set_leftchild(child);
                    else
                    par.set_rightchild(child);
                }
                else //Node has 2 children
                {
                    Node min_r=findmin(bs.get_rightchild());
                    int tset=min_r.get_data();
                    //min would be that node itself or left leaf
                    Node par=min_r.get_parent();
                    if(par==bs)
                    {
                        bs.set_rightchild(min_r.get_rightchild());
                        bs.set_data(tset);
                    }
                    else
                    {
                        par.set_leftchild(null);
                        bs.set_data(tset);
                    }
                   
                }
            }
        }
        else if(bs.get_data()>n)
            del(n,bs.get_leftchild());
             else
            del(n,bs.get_rightchild());
    }
}

public void preorder(Node bs)
{
    if(bs==null)
    return;
    else
    {
        System.out.print(bs.get_data()+" ");
        preorder(bs.get_leftchild());
        preorder(bs.get_rightchild());
    }
}

public void postorder(Node bs)
{
    if(bs==null)
    return;
    else
    {
        postorder(bs.get_leftchild());
        postorder(bs.get_rightchild());
        System.out.print(bs.get_data()+" ");
    }
}

public void inorder(Node bs)
{
    if(bs==null)
    return;
    else
    {
        inorder(bs.get_leftchild());
        System.out.print(bs.get_data()+" ");
        inorder(bs.get_rightchild());
    }
}
}

class check
{
public static void main(String[] args)throws IOException
{
    FileReader fr=new FileReader("input.txt");
    BufferedReader br=new BufferedReader(fr);
    InputStreamReader isr=new InputStreamReader(System.in);
    BufferedReader br1=new BufferedReader(isr);
    String line=br.readLine();
    String[] numS=line.split(" ");
    int[] numbers=new int[numS.length];
    //create the bst
    Avl tree=new Avl();
    //input the elements
    for(int i=0;i<numS.length;i++)
    {
        numbers[i]=Integer.parseInt(numS[i]);
        Node n=new Node(numbers[i]);
        tree.insert(n,tree.root);
    }
    //print the preorder
    System.out.println("preorder traversal ::");
    tree.preorder(tree.root);
    System.out.println("\nPostorder traversal::");
    tree.postorder(tree.root);
    System.out.println("\ninorder traversal ::");
    tree.inorder(tree.root);
    //options
    Node nn;
    int d,s;
    while(true)
    {
    System.out.println("\n1.tree height\n2.Search(int)\n3.findmin()\n4.findmax()\n5.preorder()\n6.postorder()\n7.inorder()\n8.exit\n");
    int input=Integer.parseInt(br1.readLine());
    switch(input)
    {
        /*case 1: d=Integer.parseInt(br1.readLine());
            tree.del(d,tree.root);
            break;*/
        case 2: s=Integer.parseInt(br1.readLine());
            tree.search(s,tree.root);
            break;
        case 3: nn=tree.findmin(tree.root);
            System.out.println(nn.get_data());
            break;
        case 4: nn=tree.findmax(tree.root);
            System.out.println(nn.get_data());
            break;
        case 5:tree.preorder(tree.root);
            System.out.println();
            break;
        case 6:tree.postorder(tree.root);
            System.out.println();
            break;
        case 7:tree.inorder(tree.root);
            System.out.println();
            break;
        case 1:System.out.println(tree.get_height(tree.root));
            break;
        case 8:System.exit(1000);
            break;
        default:System.out.println("Not an option");
            break;
    }
    }
}
}

Copyright @ 2013 code-craft. Designed by Templateism | MyBloggerLab