二叉排序數,又叫做二叉查找樹,它或者是一顆空樹,後者是具有下列性質的二叉樹。:
- 如果它的左右子樹不爲空,左子樹上所有節點的值均小於它的根節點的值,右子樹就是大於它的根節點的值,
- 它的左右子樹也分別是二叉排序樹
首先提供一個二叉樹的結構:
class Node{
int val;
Node left;
Node right;
Node(int val){
this.val = val;
left = null;
right = null;
}
}
然後插入一系列的數值,比根節點大的就插入右子樹,比根節點小的就插入左子樹,採用的是遞歸的方法:
private Node insert(Node node, int value){
if(node == null){
node = new Node(value);
}else{
if(value <= node.value){
node.left = insert(node.left. value);
}else{
node.right = insert(node.right, value);
}
}
return node;
}
例如我們用一段數組來實現一個二叉查找樹:
public class BinaryTress{
private Node root;
BinaryTress(){
root = null;
}
BinaryTree(int[] arr) {
for (int i : arr) {
insert(i);
}
}
private void insert(int val) {
root = insert(root, val);
}
}
如果我們想知道某個數是不是在這個二叉排序樹中。
private boolean findValue(Node node, int value){
if(node.val == value){
return true;
}else if(node.val > value){
return findValue(node.left, value);
}else if(node.val < value){
return findValue(node.right, value);
}else{
return false;
}
}
總之二叉排序樹是以鏈式的方式存儲的,保持了鏈式存儲結構在執行插入或者刪除操作時不用移動元素的優點,只要找到合適的插入和刪除位置後,僅需要移到鏈接指針即可,插入刪除的時間性能比較好。而對於二叉查找樹,其比較的次數等於給定值的節點在二叉樹的層數,然而二叉查找樹的形狀是不確定的,所以這也是缺點所在。。。