標籤:資料結構二叉尋找樹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實現