二叉樹的建立及遍歷(JavaScript實現)

tonychen發表於2017-12-20

二叉樹是常見的資料結構之一,當然也是程式猿必須得熟悉的資料結構之一。大一時我用過C++C語言實現過它,那最近都在用javascript,索性就寫一下javascript版本的二叉樹,相信不會太難。

建立二叉樹

一些常見的二叉樹

學過二叉樹的都應該知道,一棵二叉樹最多隻能有兩個分支結點,當然也能沒有結點。下圖是常見的二叉樹的形式:

binary-tree
圖一隻有一個根結點,而圖2和圖5除葉子節點外都有兩個節點,圖3和圖4則是比較極端的情況,只有左子樹/右子樹,網上很多人都把它叫做退化成為線性表

實現程式碼

通常二叉樹都是用的形式來建立的,雖然javscript現在也有了,但是為了熟悉一下原型,這裡還是用原型來模擬的行為。以下是實現的程式碼:

function Node(){
    this.data = null
    this.leftChild = null
    this.rightChild = null
}

function binaryTree(){
    this.root = null
}
複製程式碼

可以看到這裡定義了兩個類,一個是Node類,另一個是binaryTree類。其中一個結點含有資料域,和它的左指標以及右指標,而一顆樹則含有結點包含的一切屬性,以及一個根節點。這裡可以看做樹是結點的子類,下面則利用原型來實現它們之間的繼承關係:


binaryTree.prototype = {
    constructor: Node,
    insertNode: function(data){
        if(this.root === null){
            this.root = {}
            this.root.data = data
        }else{
            insertNode(this.root, data)
        }
    }
}

//插入結點,這裡構造的是一顆二叉搜尋樹
function insertNode(node,data){
    if(node.data < data){
        if(node.leftChild === null){
            node.leftChild = { data }
        }else{
            insertNode(node.leftChild, data)
        }
    }else{
        if(node.rightChild === null){
            node.rightChild = { data }
        }else{
            insertNode(node.rightChild, data)
        }
    }
}
複製程式碼

遍歷二叉樹

常見的二叉樹遍歷方式有:前序遍歷後序遍歷中序遍歷以及層次遍歷,這些遍歷方式可以用遞迴來實現,當然用佇列或者來實現也是可以的,但是遞迴還是要來得簡潔一些,程式碼如下:

binaryTree.prototype = {
    constructor: Node,
    ...
    travelTree: function(root){//前序遍歷
        console.log(root.data)
        this.travelTree(root.leftChild)
        this.travelTree(root.rightChild)
    }
}
複製程式碼

以上就是javascript實現的二叉樹的建立和遍歷,完整的程式碼請點選

相關文章