概述:
首先進行下面的對比:
線性結構
順序存儲,不排序:查找困難
順序存儲,排序:刪除插入困難
鏈式存儲:無論是否排序,查找困難
綜合以上特點,我們就想有沒有一種結構,能夠刪除、查找、插入都不是那麼困難,能夠綜合上述優
點,這個時候我們就引入了二叉排序樹。
樹結構查找是將查找表按照某種規律建成樹結構。因爲建構的樹結構是按某種規律建立的,因此查找
過程也遵循這種規律,可以獲得較高的查找效率。
1、二叉排序樹的定義:
二叉排序樹,也叫二叉查找樹、二叉搜索樹,簡稱BST。
二叉排序樹(Binary Sort Tree)或者是一棵空樹,或者是具有下列性質的二叉樹:
(1)若左子樹不空,則左子樹上所有節點的值均小於根節點的值;若右子樹不空,則右子樹上所有節
點的值均大於根節點的值。
(2)左右子樹也分別是二叉排序樹。
(3)沒有鍵值相等的節點。
如下圖所示就是一顆二叉排序樹:
2、二叉排序樹中的查找
若將查找表組織爲一棵二叉排序樹,則根據二叉排序樹的特點,查找過程爲:
(1) 若查找樹爲空,查找失敗;
(2) 若查找樹非空,將給定關鍵碼kx與查找樹根節點的關鍵碼進行比較:
a. 若相等,查找成功,結束查找過程。
b. 若給定關鍵碼kx小於根節點關鍵碼,查找將在左子樹上繼續進行,轉1;
c. 若給定關鍵碼kx大於根節點關鍵碼,查找將在右子樹上繼續進行,轉1;
代碼展示
節點類
package demo10;
public class Node {
int value;
Node left;
Node right;
public Node(int value){
this.value=value;
}
/**
* 向子樹中添加節點
* @param node
*/
public void add(Node node) {
if(node==null){
return;
}else{
//判斷傳入的節點的值比當前子樹的根節點的值大還是小
//添加的節點比當前節點的值更小
if(node.value<this.value){
//如果左節點爲空
if(this.left==null){
this.left=node;
}
//如果不爲空
else{
this.left.add(node);
}
//添加的節點比當前節點的值大
}else{
if(this.right==null){
this.right=node;
}else{
this.right.add(node);
}
}
}
}
/**
* 中序遍歷二叉排序樹,從小到大排序
* @param node
*/
public void midShow(Node node) {
if(node==null){
return;
}
midShow(node.left);
System.out.print(node.value+" ");
midShow(node.right);
}
}
樹實體類
package demo10;
public class BinarySortTree {
Node root;
/**
* 向二叉排序樹中添加節點
* @param node
*/
public void add(Node node){
//如果是一棵空樹
if(root==null){
root=node;
}else{
root.add(node);
}
}
/**
* 中序遍歷二叉排序樹,從小到大的順序
*/
public void midShow(){
if(root!=null){
root.midShow(root);
}
}
}
測試類
package demo10;
public class TestBinarySortTree {
public static void main(String[] args) {
int[] arr = new int[]{7,3,10,12,5,1,9};
//創建一棵二叉排序樹
BinarySortTree bst = new BinarySortTree();
//循環添加
for(int i:arr){
bst.add(new Node(i));
}
//查看樹中的值
System.out.println("二叉排序樹中序遍歷:");
bst.midShow();
}
}