也被成為 ordered binary tree(有序二叉樹)或 sorted binary tree(排序二叉樹),有如下性質:
若任意節點的左子樹不空,則左子樹上所有節點的值均小於它的根節點的值;
若任意節點的右子樹不空,則右子樹上所有節點的值均大於它的根節點的值;
任意節點的左、右子樹也分別為二叉查詢樹;
沒有鍵值相等的節點。
資料:查詢快 o(1),插入慢o(n) 需要移動插入點之後的所有資料。
鍊錶:查詢慢 o(n) ,插入快 o(1) 每次查詢都需要遍歷一遍
於是作為平衡的binary search tree出現了
查詢 平均o(logn) 最差o(n)
插入 平均o(logn) 最差o(n)
首先定義node,最少包含3個屬性,左節點,右節點和值。
public
class
node
}
按照 root ー> left subtree ー> right subtree 的順序訪問節點。
遞迴實現
public
void
printpreorder
(node n)
system.out.
println
(n.data);if
(n.left != null)
if(n.right != null)
}
非遞迴實現public
void
printpreorderwithoutrecursion
(node n)
stack
s =newstack
(); node current = n;
while
(current != null ||
!s.isempty()
)if(!s.
empty()
)}}
按照 left subtree ー> root ー> right subtree 的順序訪問節點。
遞迴實現
public
void
printmidorder
(node n)
if(n.left != null)
system.out.
println
(n.data);if
(n.right != null)
}
非遞迴實現public
void
printmidorderwithoutrecursion
(node n)
stack
s =newstack
(); node current = n;
while
(current != null ||
!s.isempty()
)if(!s.
empty()
)}}
按照 left subtree ー> right subtree ー> root 的順序訪問節點。
遞迴實現
public
void
printaftorder
(node n)
if(n.left != null)
if(n.right != null)
system.out.
println
(n.data)
;}
非遞迴實現
後序遍歷的非遞迴實現方法有好幾種,其中的乙個思路是在node中增加乙個標誌位來記錄是否是第一次訪問,如果是第一次訪問就再次入棧並查詢right subtree,只有當right subtree也查詢完成之後第二次入棧的時候再列印。
public
class
node
}
public
void
printaftorderwithoutrecursion_1
(node n)
stack
s =newstack
(); node current = n;
while
(current != null ||
!s.isempty()
)if(!s.
empty()
)else}}
}
二叉搜尋樹 Binary Search Tree
完整 二叉搜尋樹是這樣一種二叉樹,對於乙個結點x,如果它的左子樹的結點值都小於x,它的右子樹的結點值都大於x。並且他的左子樹和右子樹也滿足此特性的二叉樹。二叉搜尋樹的中序遍歷可得到資料的有序序列。bst結點的前驅是指該結點的前乙個結點,即指向該結點的結點。bst結點的後繼是指該結點的右子樹中值最接近...
二叉查詢樹 Binary Search Tree
本帖部分文字和來自於 但所有 均為原創 二叉查詢樹 英語 binary search tree 也稱二叉搜尋樹 有序二叉樹 英語 ordered binary tree 排序二叉樹 英語 sorted binary tree 是指一棵空樹或者具有下列性質的二叉樹 二叉查詢樹相比於其他資料結構的優勢在...
二叉查詢樹 BinarySearchTree
一 定義tree介面public inte ce treeextends iterable二 實現抽象便利類abstracttree public abstract class abstracttreeimplements tree override public void preorder ove...