資料結構--二叉尋找樹的java實現

來源:互聯網
上載者:User

標籤:資料結構二叉尋找樹java實現

上代碼:
package com.itany.erchachazhaoshu;public class BinarySearchTree<T extends Comparable<? super T>>{    //定義二叉尋找樹的根節點  每一個尋找二叉樹都有一個自己的root  節點 root外界看不到    private BinaryNode<T> root;    public BinarySearchTree()    {        root=null;    }    //節點類    private static class BinaryNode<T>    {        private T element;        private BinaryNode<T> left;        private BinaryNode<T> right;        public BinaryNode(T element)        {            this(element, null, null);        }        public BinaryNode(T element,BinaryNode<T> left,BinaryNode<T> right)        {            this.element=element;            this.left=left;            this.right=right;        }    }    public void makeEmpty()    {        root=null;    }    public boolean isEmpty()    {        return root==null;    }    public boolean contains(T t)    {        return contains(t,root);    }    //外界是不認識節點的  只會返回T 布爾 或者根本無傳回值    public T findMax() throws Exception    {        if(isEmpty())            throw new Exception();        return findMax(root).element;    }    public T findMin() throws Exception    {        if(isEmpty())            throw new Exception();        return findMin(root).element;    }    public void insert(T t)    {        root=insert(t,root);    }    public void remove(T t)    {        root=remove(t,root);    }    //此處使用的是尾遞迴    private boolean contains(T t,BinaryNode<T> root)    {        //必須在一開始就判斷是否為null 否則在調用方法或元素時 會產生null 指標異常  也是一個基準條件        if(root==null)            return false;        int compareRes=t.compareTo(root.element);        if(compareRes==0)            return true;        else if(compareRes<0)            return contains(t,root.left);//不會使棧頻繁進出 只會覆蓋當前棧        else            return contains(t,root.right);    }    // 方法二 使用迴圈代替尾遞迴找出最大 是返回對應的那個節點    private BinaryNode<T> findMax(BinaryNode<T> root)    {        if(root==null)            return null;        else        {            while(root.right!=null)            {                root=root.right  ;            }        }        return root;    }    //方法一 使用遞迴尋找 返回最小節點的引用    private BinaryNode<T> findMin(BinaryNode<T> root)    {        //必須在一開始就判斷是否為null 否則在調用方法或元素時 會產生null 指標異常        if(root==null)            return null;        //基準條件        else if(root.left==null)            return root;        else            return findMin(root.left);    }    //返回一個插入了之後的整個節點 逐級返回    private BinaryNode<T> insert(T t,BinaryNode<T> root)    {        if(root==null)            return new BinaryNode<T>(t,null,null);        else        {            int com=t.compareTo(root.element);            if(com==0)                ;            else if(com<0)                //不斷更新當前root的left值 並返回root                root.left=insert(t,root.left);            else                root.right=insert(t,root.right);            return root;        }    }    //刪除和增加一樣 都要返回修改之後的節點    private BinaryNode<T> remove(T t,BinaryNode<T> root)    {        //沒有找到刪除的  什麼也不做  直接返回該root        if(root==null)            return root;        int com=t.compareTo(root.element);        if(com<0)        {            root.left=remove(t,root.left);        }        else if(com>0)        {            root.right=remove(t,root.right);        }        else        {            //有兩個兒子的情況             if(root.left!=null && root.right!=null)            {                root.element=findMin(root.right).element;                root.right=remove(root.element,root.right);//更新刪除之後            }            else//包括一個兒子都沒有的情況 有一個兒子的情況                return (root.left!=null)?root.left:root.right;                        }        return root;    }}
package com.itany.erchachazhaoshu;public class Test{        public static void main(String[] args)    {        BinarySearchTree bt=new BinarySearchTree();        bt.insert(3);        bt.insert(13);        bt.insert(1);        try        {            System.out.println("max:"+bt.findMax());            System.out.println("max:"+bt.findMin());            System.out.println(bt.contains(3));             bt.remove(13);            System.out.println(bt.contains(13));        }        catch (Exception e)        {            e.printStackTrace();        }    }    }


資料結構--二叉尋找樹的java實現

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.