資料結構---二分搜尋樹(java實現)
阿新 • • 發佈:2018-11-13
樹
樹的分類
1、 二分搜尋樹
2、 平衡二叉樹: AVL;紅黑樹
3、 堆; 並查集
4、線段樹;Trie(字典樹、字首樹)
二叉樹
二叉樹具有天然的遞迴結構
每個節點的左子樹也是二叉樹
每個節點的右子樹也是二叉樹
二叉樹不一定是“滿”的
一個節點也是二叉樹
NULL 空也是二叉樹
二分搜尋樹
二分搜尋樹是二叉樹
二分搜尋樹的每個節點的值大於其左子樹的所有節點的值
二分搜尋樹的每個節點的值小於其右子樹的所有節點的值
每一棵子樹也是二分搜尋樹
二分搜尋樹也不一定是“滿”二叉樹
二分搜尋樹的資料需要具有可比較性
二分搜尋樹的java程式碼實現
package com.pc.二分搜尋樹;
/**
* @author 10430
*下午10:41:23 2018年10月21日
*
*/
public class BinarySearchTree <E extends Comparable<E>>{
Node root;
public BinarySearchTree (E e) {
root = new Node(e);
}
public BinarySearchTree () {
root = null;
}
/**
* 向二分搜尋樹中增加節點 非遞迴實現
* @param e
*/
public void add (E e) {
if (root == null) {
root = new Node(e);
return;
}
Node dummyRoot = root ;
while (true){
if (e.compareTo(dummyRoot.data)<0 ) {
if (dummyRoot.left == null) {
dummyRoot.left = new Node(e);
return;
} else {
dummyRoot = dummyRoot.left;
continue ;
}
}
if (e.compareTo(dummyRoot.data)>0 ) {
if (dummyRoot.right == null) {
dummyRoot.right = new Node(e);
return;
} else {
dummyRoot = dummyRoot.right;
continue;
}
}
}
}
/**
* 查詢tree中是否包含某個節點 遞迴實現
* @param e
*/
public boolean find (E e) {
return contains(root ,e);
}
private boolean contains (Node root , E e) {
if (root == null) {
return false;
}
if (root.data.compareTo(e)>0) {
return contains(root.left,e);
} else if (root.data.equals(e)) {
return true ;
}else {
return contains(root.right,e);
}
}
/**
* 二分搜尋樹 查詢元素 (非遞迴實現)
* @param e
* @return
*/
public boolean findNotRecursive (E e) {
if (root == null) {
return false;
}
Node dummyRoot = root ;
while (true){
if (e.compareTo(dummyRoot.data) == 0) {
return true;
}
if (e.compareTo(dummyRoot.data)<0 ) {
if (dummyRoot.left == null) {
return false;
} else {
dummyRoot = dummyRoot.left;
continue;
}
}
if (e.compareTo(dummyRoot.data)>0 ) {
if (dummyRoot.right == null) {
return false;
} else {
dummyRoot = dummyRoot.right;
continue;
}
}
}
}
private class Node {
private E data;
public Node left;
public Node right;
private Node(E e) {
this.data = e;
left = null;
right = null ;
}
}
public static void main(String[] args) {
BinarySearchTree<Integer> tree = new BinarySearchTree<Integer>(10);
tree.add(8);
tree.add(12);
tree.add(6);
tree.add(100);
tree.add(128);
// tree.findNotRecursive(6);
System.out.println(tree.find(127)+" "+tree.findNotRecursive(127));
System.out.println(tree.find(6)+" "+tree.findNotRecursive(6));
System.out.println(tree.find(11)+" "+tree.findNotRecursive(11));
System.out.println(tree.find(128)+" "+tree.findNotRecursive(128));
}
}