对二叉树和平衡二叉树实现

来源:互联网 发布:入门级手表 知乎 编辑:程序博客网 时间:2024/04/27 17:13

二叉树实现和平衡二叉树实现

    

package cn.itcast.shujujiegou.tree;/** * Created by likailong on 2016/9/28. * 二叉查找树要求所有的项都可以排序故实现某一个接口 * 数不能太深 */public class BinarySearchTree<T extends Comparable<? super T>>{    private static class BinaryNode<T> {        T element;//数据        BinaryNode<T> left;//左节点        BinaryNode<T> right;//右节点        BinaryNode(T theElement){//初始化            this(theElement,null,null);        }        BinaryNode(T theElement,BinaryNode<T> lt,BinaryNode<T>rt){            element=theElement;            left=lt;            right=rt;        }    }    private BinaryNode<T> root;    public BinarySearchTree(){        root=null;    }    public void makeEmpty(){        root=null;    }    public boolean isEmpty(){        return root==null;    }    public boolean contains(T x){        return contains(x,root);    }    private boolean contains(T x,BinaryNode<T> t){        if(t==null)            return false;        int compareResult=x.compareTo(t.element);        if(compareResult<0)            return contains(x,t.left);        else if(compareResult>0)            return contains(x,t.right);        else return true;    }    public T findMin(){        if(isEmpty())            throw new UnderflowException("没有根结点");        return findMin(root).element;    }    public T findMax(){        if(isEmpty())            throw new UnderflowException("没有根结点");        return findMax(root).element;    }    public BinaryNode<T> findMax(BinaryNode<T> t){        if(t!=null)            while (t.right!=null)                t=t.right;        return t;    }    public BinaryNode<T> findMin(BinaryNode<T> t){        if(t==null){          return null;        }else if(t.left==null)            return t;        return findMin(t.left);    }    public void insert(T x){        root=insert(x,root);    }    private BinaryNode<T> insert(T x,BinaryNode<T> t){        if(t==null)            return new BinaryNode<T>(x,null,null);        int compareResult=x.compareTo(t.element);        if(compareResult>0)            t.left=insert(x,t.left);        else if(compareResult>0)            t.right=insert(x,t.right);        else;        return t;    }    public void remove(T x){        root=remove(x,root);    }    private BinaryNode<T> remove(T x,BinaryNode<T> t){      if(t==null)          return t;        int comparResult=x.compareTo(t.element);        if(comparResult<0)            t.left=remove(x,t.left);        else if(comparResult>0)            t.right=remove(x,t.right);        else if(t.left!=null&&t.right!=null){            t.element=findMin(t.right).element;            t.right=remove(t.element,t.right);        }else            t=(t.left!=null)?t.left:t.right;        return t;    }    public void printTree(){        if(isEmpty())            System.out.print("-----null tree----");        else            printTree(root);    }    public int height(){        return height(root);    }    private int height(BinaryNode<T> t){        if(t==null)            return -1;        else            return 1+Math.max(height(t.left),height(t.right));    }    private void printTree(BinaryNode<T> t){        if(t!=null){            printTree(t.left);            System.out.println(t.element);            printTree(t.right);        }    }}
平衡树的实现  
package cn.itcast.shujujiegou.tree;/** * Created by likailong on 2016/9/28. */public class AVLTree<T extends Comparable<? super T>> {    private AvlNode<T> root;    public AVLTree(){        root=null;    }    private static class AvlNode<T> {        T element;        AvlNode<T >left;        AvlNode<T> right;        int height;        AvlNode(T theElement){            this(theElement,null,null);        }        AvlNode(T theElement,AvlNode<T> lt,AvlNode<T> rt){            left=lt;            right=rt;            element=theElement;        }    }    public void insert(T element){        root=insert(element,root);    }    private AvlNode<T> insert(T x,AvlNode<T> t){        if(t==null)            return new AvlNode<T>(x,null,null);        int compareResult=x.compareTo(t.element);        if(compareResult<0)            t.left=insert(x,t.left);        else if(compareResult>0)            t.right=insert(x,t.right);        else ;        return balance(t);    }    private static final int  ALLOW_IMBALANCE=1;    private AvlNode<T> balance(AvlNode<T> t) {        if(t==null)            return null;        if(height(t.left)-height(t.right)>ALLOW_IMBALANCE){            if(height(t.left.left)>=height(t.left.right))            t=rotateWithLeftChild(t);            else                t=doubleWithLeftChild(t);        }        else{            if(height(t.right)-height(t.left)>ALLOW_IMBALANCE){                if(height(t.right.right)>=height(t.right.left))                    t=rotateWithRightChild(t);                else                    t=doubleWithRightChild(t);            }        }        t.height=Math.max(height(t.left),height(t.right))+1;        return t;    }    private AvlNode<T> rotateWithRightChild(AvlNode<T> k2 ){        AvlNode<T> k1=k2.right;        k2.right=k1.left;        k1.left=k2;        k2.height=Math.max(height(k2.left),height(k2.right))+1;        k1.height=Math.max(height(k1.left),k2.height)+1;        return k1;    }    private AvlNode<T> rotateWithLeftChild(AvlNode<T> k2 ){        AvlNode<T> k1=k2.left;        k2.left=k1.right;        k1.right=k2;        k2.height=Math.max(height(k2.left),height(k2.right))+1;        k1.height=Math.max(height(k1.left),k2.height)+1;        return k1;    }    private AvlNode<T> doubleWithLeftChild(AvlNode<T> k3 ){       k3.left=rotateWithRightChild(k3.left);        return rotateWithLeftChild(k3);    }    private AvlNode<T> doubleWithRightChild(AvlNode<T> k3 ){        k3.left=rotateWithLeftChild(k3.left);        return rotateWithRightChild(k3);    }    public int height(){        return height(root);    }    private int height(AvlNode<T>t){        return t==null?-1:t.height;    }    public void remove(T x){        root=remove(x,root);    }    private AvlNode<T> remove(T x,AvlNode<T> t){        if(t==null)            return null;        int compareResult=x.compareTo(t.element);        if(compareResult<0)            t.left=remove(x,t.left);        else if(compareResult>0)            t.right=remove(x,t.right);        else  if(t.left!=null&&t.right!=null){            t.element=(T)findMin(t.right).element;            t.right=remove(t.element,t.right);        }        else            t=(t.left!=null)?t.left:t.right;        return balance(t);    }    private AvlNode findMin(AvlNode<T> t) {        if(t==null){            return null;        }else if(t.left==null)            return t;        return findMin(t.left);    }    public T findMin(){        return (T)findMin(root).element;    }    public T findMax(){        return (T)findMax(root).element;    }    private AvlNode<T> findMax(AvlNode<T> t){        if(t!=null)            while (t.right!=null)                t=t.right;        return t;    }}

0 0
原创粉丝点击