JavaScript數據結構與算法 --樹的遍歷和搜索(2)

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
  • 後續是 根據特定值搜索,以及二叉樹節點刪除(這個有點麻煩)。。
  • 未完待續。。。。。。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章