是指一棵空樹或者具有下列性質的二叉樹:
1. 若任意節點的左子樹不空,則左子樹上所有節點的值均小於它的根節點的值;
2. 若任意節點的右子樹不空,則右子樹上所有節點的值均大於它的根節點的值;
3. 任意節點的左、右子樹也分別為二叉查詢樹;
4. 沒有鍵值相等的節點。
public
class
treenode
extends
comparable
>
}
向乙個二分搜尋樹b中插入乙個節點node的演算法,過程為:
1. 若b是空樹,則將node所指結點作為根節點插入
2. 若插入的值e等於節點node.e,則不處理
3. 若插入的值e小於節點node.e,則把node所指節點插入到左子樹中
4. 若插入的值e大於節點node.e,則把node所指節點插入到右子樹中
public
void
add(e e)
private treenodeadd(treenodenode,e e)
if(e.compareto(node.e) < 0) else
if(e.compareto(node.e) > 0)
return node;
}
在二叉搜尋樹b中查詢e的過程為:
1. 若b是空樹,則搜尋失敗,否則:
2. 若e等於b的根節點的資料域之值,則查詢成功;否則:
3. 若e小於b的根節點的資料域之值,則查詢左子樹;否則:
4. 查詢右子樹。
1. 查詢乙個數在不在二分搜尋樹的節點中
private
boolean
find(treenodenode,e e)else
if(e.compareto(node.e) < 0) else
}2. 查詢二分搜尋樹中的最小元素
//查詢最小元素
public e findmin()
public treenodefindmin(treenodenode)
3. 查詢二分搜尋樹中的最大元素
//查詢最大元素
public e findmax()
public treenodefindmax(treenodenode)
刪除節點分三種情況
1. 刪除樹中最小元素 遞迴實現
/*** 刪除以node為根的二分搜尋樹中的最小的節點
* 返回刪除節點後新的二分搜尋樹的根
*@param node
*@return
*/private treenoderemovemin(treenodenode)
//否則把當前節點的左子樹繼續複製給節點的left
node.left = removemin(node.left);
return node;
}2. 刪除樹中最小元素 非遞迴實現
private e removeminnr(treenoderoot)
//當前節點的父節點的左還在用當前最小節點的右孩子代替
parent.left = current.right;
return current.e;
}3. 刪除樹中最大元素 遞迴實現
/*** 刪除以node為根的二分搜尋樹中的最大的節點
* 返回刪除節點後新的二分搜尋樹的根
*@param node
*@return
*/private treenoderemovemax(treenodenode)
node.right = removemax(node.right);
return node;
}4. 刪除樹中最大元素 非遞迴實現
private e removemaxnr(treenoderoot)
parent.right = current.left;
return current.e;
}5. 刪除樹中任意節點 遞迴實現
//刪除樹中的任意元素
public
void
remove(e e)
/*** 刪除樹中任意元素
*@param node
*@param e
*@return
*/private treenoderemove(treenodenode,e e)else
if(e.compareto(node.e) > 0)elseelse
if(node.right == null)else }}
6. 刪除樹中任意節點 非遞迴實現
/*** 刪除任意節點非遞迴實現
*@param e
*/public
void
removenr(e e)
private
void
removenr(treenodenode,e e)else
if(current == null) return;
}//找到了要刪除的節點
if(current.left == null)else
if(isleftchild)else
}else
if(current.right == null)else
if(isleftchild)else
}elseelse
if(isleftchild)else
}}
1. 前序遍歷 先根節點,再左子樹,然後右子樹
//前序遍歷
public
void
preorder()
private
void
preorder(treenode node)
2. 中序遍歷 先左子樹,再根節點,然後右子樹
//中序遍歷
public
void
inorder()
private
void
inorder(treenode node)
3. 後序遍歷 先左子樹,再右子樹,然後根節點
//後序遍歷
public
void
postorder()
private
void
postorder(treenode node)
//主要通過棧實現,首先把根節點入棧,然後根節點出棧,
//然後分別把根節點右子樹,左子樹入棧,因為先序遍歷是先根,再左後右,
//所以入棧時候應該是先右再左,棧的特點是先進後出,迴圈條件是棧不為空,
//首頁的節點都出棧後,棧肯定是空的
private
void preordernr(treenode root)
if(node.left !=
null)
}}
//通過佇列實現,佇列特點是先進先出,先把根節點入隊,然後分別把他的左右子樹入隊,
//迴圈條件是佇列不為空,遍歷完,佇列一定是空的,可以畫圖理解下
private
void levelorder(treenode node)
}}
主要還是要通過畫圖和實踐才能較好理解二叉排序樹
資料結構樹之二分查詢樹
二叉查詢樹 binary search tree 也稱有序二叉樹 ordered binary tree 排序二叉樹 sorted binary tree 是指一棵空樹或者具有下列性質的二叉樹 若任意節點的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 任意節點的右子樹不空,則右子樹上所有結...
演算法與資料結構之二分搜尋樹 BST
二分搜尋樹是一顆二叉樹,二分搜尋樹的每個節點的值 大於其左子樹的所有節點的值,小於其右子樹的所有節點的值,每一顆子樹也是二分搜尋樹,二分搜尋樹儲存的元素必須具有可比較性 二分搜尋樹的定義public class bstcomparable private node root private int ...
資料結構 二分搜尋樹(BST)
1.二分搜尋樹的簡單介紹 一般來講,二叉樹的儲存資料的基本結構是封裝乙個node節點,儲存左右兩個孩子的node變數,以及乙個泛型資料,二分搜尋樹需要泛型型別實現comparable介面 必須保證左子樹的資料比右子樹大 created by upupgogogo on 2018 5 30.上午11 ...