標籤:dma search 最小值 amp oid 尋找樹 string boolean turn
package com.test.tree;public class BinarySearchTree<T extends Comparable<? super T>> { /*定義二叉樹的節點*/ private class BinaryNode<T>{ public T data; public BinaryNode<T> lt; public BinaryNode<T> rt; public BinaryNode(T data) { this(data, null, null); } public BinaryNode(T data, BinaryNode<T> lt, BinaryNode<T> rt) { this.data = data; this.lt = lt; this.rt = 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(root, x); } public boolean contains(BinaryNode<T> root, T x){ if(root == null){ return false; } int compare = x.compareTo(root.data); if(compare == 0){ return true; }else if(compare < 0){ contains(root.lt, x); }else { contains(root.rt, x); } return false; } public T findMin(){ //獲得樹中最小值 if(!isEmpty()){ return findMin(root).data; } return null; } public T findMax(){ //獲得樹中最大值 if(!isEmpty()){ return findMax(root).data; } return null; } public void insert(T data){ //插入資料 root = insert(data, root); } public void remove(T data){ root = remove(data, root); } public void printTree(){ if(root == null){ System.out.println("empty tree"); }else{ printTree(root); } } /*中序遍曆*/ public void printTree(BinaryNode<T> t){ if(t != null){ printTree(t.lt); System.out.print(t.data+"、"); printTree(t.rt); } } /** * 刪除尋找樹的某個節點,首先用要刪除節點的右子樹中最小值替換節點值, * 再從右子樹中刪除此節點,遞迴調用 * */ public BinaryNode<T> remove(T data, BinaryNode<T> t){ if(t == null){ return t; } int compare = data.compareTo(t.data); if(compare < 0){ //插入值比根節點的值小,插入到左字數 t.lt = remove(data, t.lt); }else if(compare > 0){ //插入值比根節點的值小,插入到左字數 t.rt = remove(data, t.rt); }else if(t.lt != null && t.rt != null){ t.data = findMin(t.rt).data; //將右子樹中的最小值賦給要刪除的節點 t.rt = remove(t.data, t.rt); }else{ t = t.lt == null? t.rt:t.lt; } return t; } public BinaryNode<T> insert(T data, BinaryNode<T> t){ if(t == null){ return new BinaryNode<T>(data, null, null); } int compare = data.compareTo(t.data); if(compare < 0){ //插入值比根節點的值小,插入到左字數 t.lt = insert(data, t.lt); }else if(compare > 0){ //插入值比根節點的值小,插入到左字數 t.rt = insert(data, t.rt); }else{ } return t; } public BinaryNode<T> findMin(BinaryNode<T> t){ if(t == null){ return t; }else if(t.lt == null){ //尋找樹的左邊比節點值小,找到最左邊的節點即可 return t; }else{ return findMin(t.lt); } } public BinaryNode<T> findMax(BinaryNode<T> t){ if(t == null){ return null; }else if(t.rt == null){ //尋找樹的右邊比節點值大,找到最右邊的節點即可 return t; } return findMax(t.rt); } public static void main(String[] args) { BinarySearchTree<Integer> binarySearchTree = new BinarySearchTree<Integer>(); binarySearchTree.insert(8); binarySearchTree.insert(4); binarySearchTree.insert(6); binarySearchTree.insert(3); binarySearchTree.insert(14); binarySearchTree.insert(10); System.out.println("最小值: "+binarySearchTree.findMin()); System.out.println("最大值: "+binarySearchTree.findMax()); binarySearchTree.printTree(); binarySearchTree.remove(8); System.out.println(); binarySearchTree.printTree(); }}
二叉尋找樹--java