12.遍歷二叉搜索樹
前面,我們向樹中插入了很多的數據,爲了能更好的看到測試結果,我們先來學習一下樹的遍歷。
- 注意:我們這裏學習了樹的遍歷,針對所有的二叉樹都是適用的,不僅僅二叉搜索樹。
樹的遍歷:
- 建立二叉樹
- 遍歷一棵樹是指訪問的樹的每個節點(也可以對每個節點進行某些操作,我們這裏就是簡單的打印)
- 但是樹和線性結構不太一樣,線性結構我們通常按照從前到後的順序遍歷。
- 應該從樹的頂端還是底端開始呢?從左端還是右端呢?
二叉樹的遍歷常見的有三種方法
- 先序遍歷 preOrderTraverse:先序遍歷
- 中序遍歷 inOrderTarverse:中序遍歷
- 後續遍歷 postOrderTraverse:後序遍歷
- (還有層序遍歷,使用較少,可以使用隊列來完成,此處不給實現)
實現方法
先序遍歷
-
先序遍歷過程爲:5 2 1 0 4 3 6 8 7 9 10
- 訪問根節點
- 先序遍歷其左子樹
- 先序遍歷其右子樹
-
圖示先序遍歷過程
-
代碼展示(遞歸遍歷)
//封裝先序遍歷
BinarySearchTree.prototype.preOrderTraversal = function (handler) {
this.preOrderTranversalNode(this.root, handler)
}
BinarySearchTree.prototype.preOrderTranversalNode = function (node, handler) {
if (node !== null) {
// 1.打印當前經過的節點
handler(node.key)
// 2.遍歷所有的左子樹
this.preOrderTranversalNode(node.left, handler)
// 3.遍歷所有的右子樹
this.preOrderTranversalNode(node.right, handler)
}
}
}
//代碼測試
var bst = new BinarySearchTree();
//插入節點
bst.insert(5)
bst.insert(2)
bst.insert(6)
bst.insert(8)
bst.insert(7)
bst.insert(1)
bst.insert(0)
bst.insert(9)
bst.insert(4)
bst.insert(3)
bst.insert(10)
//測試先序遍歷
function preOrderTraveral() {
var resultString = '';
bst.preOrderTraversal(function (key) {
resultString += key + ' ';
})
return resultString;
}
console.log(preOrderTraveral());
//5 2 1 0 4 3 6 8 7 9 10
中序遍歷
- 中序遍歷過程爲:0 1 2 3 4 5 6 7 8 9 10
- 中序遍歷其左子樹
- 訪問根節點
- 中序遍歷其右子樹
- 圖示中序遍歷過程
- 代碼展示(遞歸遍歷)
// 中序遍歷
BinarySearchTree.prototype.inOrderTraversal = function (handler) {
this.inOrderTraversalNode(this.root, handler)
}
BinarySearchTree.prototype.inOrderTraversalNode = function (node, handler) {
if (node !== null) {
this.inOrderTraversalNode(node.left, handler)
handler(node.key)
this.inOrderTraversalNode(node.right, handler)
}
}
}
//測試中序遍歷
function inOrderTraversal() {
var resultString = '';
bst.inOrderTraversal(function (key) {
resultString += key + ' ';
})
return resultString;
}
console.log(inOrderTraversal());
//0 1 2 3 4 5 6 7 8 9 10
後序遍歷
- 後序遍歷過程爲:0 1 3 4 2 7 10 9 8 6 5
- 後序遍歷其左子樹
- 後序遍歷其右子樹
- 訪問根節點
- 圖示後序遍歷過程
- 代碼展示(遞歸遍歷)
// 後序遍歷
// 後續遍歷
BinarySearchTree.prototype.postOrderTraversal = function (handler) {
this.postOrderTraversalNode(this.root,handler)
}
BinarySearchTree.prototype.postOrderTraversalNode = function (node, handler) {
if (node !== null) {
this.postOrderTraversalNode(node.left, handler)
this.postOrderTraversalNode(node.right, handler)
handler(node.key)
}
}
//測試後序遍歷
function postOrderTraversal() {
var resultString = '';
bst.postOrderTraversal(function (key) {
resultString += key + ' ';
})
return resultString;
}
console.log(postOrderTraversal());
//0 1 3 4 2 7 10 9 8 6 5
二叉搜索樹查找最小節點和最大節點
根據二叉搜索樹的特點我們知道一直查找左節點當左節點爲null,即爲最小值
- 代碼封裝
//獲取最小值
BinarySearchTree.prototype.min = function(){
//1.獲取根節點
var node = this.root;
// 2.依次向右查找,知道節點爲null
var key = null;
while(node != null){
key = node.key;
node = node.left;
}
return key;
}
根據二叉搜索樹的特點我們知道一直查找右節點當左節點爲null,即爲最小值
- 代碼封裝
//獲取最大值
BinarySearchTree.prototype.max = function(){
//1.獲取根節點
var node = this.root;
// 2.依次向右查找,知道節點爲null
var key = null;
while(node != null){
key = node.key;
node = node.right;
}
return key;
}
代碼測試
console.log("------------最大值最小值--------------")
//測試最大值,最小值
console.log(bst.max());
//10
console.log(bst.min());
//0
- 後續是 根據特定值搜索,以及二叉樹節點刪除(這個有點麻煩)。。
- 未完待續。。。。。。