Java建立二叉搜尋樹,實現搜尋,插入,刪除的操作執行個體,java二叉

來源:互聯網
上載者:User

Java建立二叉搜尋樹,實現搜尋,插入,刪除的操作執行個體,java二叉

Java實現的二叉搜尋樹,並實現對該樹的搜尋,插入,刪除操作(合并刪除,複製刪除)

首先我們要有一個編碼的思路,大致如下:

1、尋找:根據二叉搜尋樹的資料特點,我們可以根據節點的值得比較來實現尋找,尋找值大於當前節點時向右走,反之向左走!

2、插入:我們應該知道,插入的全部都是葉子節點,所以我們就需要找到要進行插入的葉子節點的位置,插入的思路與尋找的思路一致。

3、刪除:

1)合并刪除:一般來說會遇到以下幾種情況,被刪節點有左子樹沒右子樹,此時要讓當前節點的父節點指向當前節點的左子樹;當被刪節點有右子樹沒有左子樹,此時要讓當前節點的父節點指向該右子樹;當被刪節點即有左子樹又有右子樹時,我們可以找到被刪節點的左子樹的最右端的節點,然後讓這個節點的右或者左“指標”指向被刪節點的右子樹

2)複製刪除:複製刪除相對而言是比較簡單的刪除操作,也是最為常用的刪除操作。大致也有以下三種情況:當前節點無左子樹有右子樹時,讓當前右子樹的根節點替換被刪節點;當前節點無右子樹有左子樹時,讓當前左子樹的根節點替換被刪除節點;當前被刪節點既有左子樹又有右子樹時,我們就要找到被刪節點的替身,可以在被刪節點的左子樹中找到其最右端的節點,並讓這個節點的值賦給被刪節點,然後別忘了讓此替身節點的父節點指向替身的“指標”為空白,(其實在Java中無關緊要了,有垃圾處理機制自動進行處理)。你也可以在當前被刪節點的右子樹的最左端的節點作為替身節點來實現這一過程。

接下來就上代碼吧。

首先是## 二叉搜尋樹節點類 ##

package SearchBinaryTree;public class SearchBinaryTreeNode<T> {  T data;  public SearchBinaryTreeNode<T> leftChild;  public SearchBinaryTreeNode<T> rightChild;  public SearchBinaryTreeNode(){    this.data=null;    this.leftChild=this.rightChild=null;  }  public SearchBinaryTreeNode(T da){    this.data=da;    this.leftChild=this.rightChild=null;  }  public SearchBinaryTreeNode(T da,SearchBinaryTreeNode<T> left,SearchBinaryTreeNode<T>right){    this.data=da;    this.leftChild=left;    this.rightChild=right;  }  public T getData() {    return data;  }  public void setData(T data) {    this.data = data;  }  public SearchBinaryTreeNode<T> getLeftChild() {    return leftChild;  }  public void setLeftChild(SearchBinaryTreeNode<T> leftChild) {    this.leftChild = leftChild;  }  public SearchBinaryTreeNode<T> getRightChild() {    return rightChild;  }  public void setRightChild(SearchBinaryTreeNode<T> rightChild) {    this.rightChild = rightChild;  }  public boolean isLeaf(){    if(this.leftChild==null&&this.rightChild==null){      return true;    }    return false;  }}

實現二叉搜尋樹

package SearchBinaryTree;public class SearchBinaryTree<T> {  SearchBinaryTreeNode<T> root;  public boolean isEmpty(){    if(root==null){      return true;    }    return false;  }  public void Visit(SearchBinaryTreeNode<T> root){    if(root==null){      System.out.println("this tree is empty!");    }    System.out.println(root.getData());  }  public SearchBinaryTreeNode<T> getRoot(){    if(root==null){      root=new SearchBinaryTreeNode<T>();    }    return root;  }  public SearchBinaryTree(){    this.root=null;  }  /*   * 創造一顆二叉樹   */  public void CreateTree(SearchBinaryTreeNode<T> node, T data) {    if (root == null) {      root = new SearchBinaryTreeNode<T>();    } else {      if (Math.random() > 0.5) {          //採用隨機方式建立二叉樹        if (node.leftChild == null) {          node.leftChild = new SearchBinaryTreeNode<T>(data);        } else {          CreateTree(node.leftChild, data);        }      } else {        if (node.rightChild == null) {          node.rightChild = new SearchBinaryTreeNode<T>(data);        } else {          CreateTree(node.rightChild, data);        }      }    }  }  /*   * 在二查搜尋樹中進行搜尋   */  public SearchBinaryTreeNode<T> search(SearchBinaryTreeNode<T> root,T value){    SearchBinaryTreeNode<T> current=root;    while((root!=null)&&(current.getData()!=value)){      //需要注意的是java中泛型無法比較大小,在實際的使用時我們可以使用常見的資料類型來替代這個泛型,這樣就不會出錯了      current=(value<current.getData()?search(current.leftChild,value):search(current.rightChild,value));    }    return current;  }  public SearchBinaryTreeNode<T> insertNode( T value){    SearchBinaryTreeNode<T> p=root,pre=null;    while(p!=null){      pre=p;      //需要注意的是java中泛型無法比較大小,在實際的使用時我們可以使用常見的資料類型來替代這個泛型,這樣就不會出錯了      if(p.getData()<value){        p=p.rightChild;      }else{        p=p.leftChild;      }    }    if(root==null){      root=new SearchBinaryTreeNode<T>(value);    }else if(pre.getData()<value){      pre.rightChild=new SearchBinaryTreeNode<T>(value);    }else{      pre.leftChild=new SearchBinaryTreeNode<T>(value);    }  }  /*   * 合并刪除   */  public void deleteByMerging(SearchBinaryTreeNode<T> node){    SearchBinaryTreeNode<T> temp=node;    if(node!=null){      //若被刪除節點沒有右子樹,用其左子樹的根節點來代替被刪除節點      if(node.rightChild!=null){        node=node.leftChild;      }else if(node.leftChild==null){        //若被刪節點沒有左子樹,用其有字數的最左端的節點代替被刪除的節點        node=node.rightChild;      }else{        //如果被刪節點左右子樹均存在        temp=node.leftChild;        while(temp.rightChild!=null){          temp=temp.rightChild;   //一直尋找到左子樹的右節點        }        //將尋找到的節點的右指標賦值為被刪除節點的右子樹的根        temp.rightChild=node.rightChild;        temp=node;        node=node.leftChild;      }      temp=null;    }  }  /*   * 複製刪除   */  public void deleteByCoping(SearchBinaryTreeNode<T> node){    SearchBinaryTreeNode<T> pre=null;    SearchBinaryTreeNode<T> temp=node;    //如果被刪節點沒有右子樹,用其左子樹的根節點來代替被刪除節點    if(node.rightChild==null){      node=node.leftChild;    }else if(node.leftChild==null){      node=node.rightChild;    }else{      //如果被刪節點的左右子樹都存在      temp=node.leftChild;      pre=node;      while(temp.rightChild!=null){        pre=temp;        temp=temp.rightChild;   //遍曆尋找到左子樹的最右端的節點      }      node.data=temp.data;      //進行賦值操作      if(pre==node){        pre.leftChild=node.leftChild;      }else{        pre.rightChild=node.rightChild;      }    }    temp=null;  }}

測試類別

package SearchBinaryTree;public class SearchBinaryTreeTest {  public static void main(String []args){    SearchBinaryTree<Integer> tree=new SearchBinaryTree<Integer>();    for(int i=1;i<10;i++){      tree.CreateTree(new SearchBinaryTreeNode<Integer>(), i);    }    //搜尋    tree.search(tree.root, 7);    //合并刪除    tree.deleteByMerging(new SearchBinaryTreeNode<Integer>(8));    //複製刪除    tree.deleteByCoping(new SearchBinaryTreeNode<Integer>(6));  }}

好了,就是這樣!

以上這篇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.