1. 程式人生 > 其它 >js(es6)實現二叉樹的插入、前序遍歷、中序遍歷、後序遍歷

js(es6)實現二叉樹的插入、前序遍歷、中序遍歷、後序遍歷

技術標籤:資料結構資料結構二叉樹

導航:js(es6)實現單向連結串列——連結串列新增、刪除、反轉方法的實現.

基礎

1、在二叉樹的遍歷中,前中後是指父節點遍歷的順序
2、三個遍歷中,左子樹永遠比右子樹先遍歷

  • 前序遍歷:根左右
  • 中序遍歷:左根右
  • 後序遍歷:左右中

舉例說明
在這裡插入圖片描述

  • 前序遍歷:ABDC

  • 中序遍歷:DBAC

  • 後序遍歷:DBCA

ES6 程式碼實現

節點類

一個節點有左右指標和自身的value三個屬性

class Node{
    constructor (data){
        this.left = null
        this.right = null
        this
.value = data } }

樹類

class Tree{
    constructor (){
        this.root = null
    }
}

插入節點方法

這裡構建的是二叉搜尋樹,即父節點的值大於左節點的值,小於右節點的值
以下insertByFather方法會判斷新節點要插入到二叉搜尋樹的哪個位置,insert方法用來建立節點並呼叫insertByFather方法。

//根據給出的父節點,判斷將新節點插在其左還是其右
insertByFather(node, newNode) {
	//如果新節點value小於父節點value,則插入父節點左子樹上,否則插入右子樹上
if(newNode.value < node.value){ //如果父左子樹存在,則遞迴判斷插入,否則新節點就是父左子節點 if(node.left){ insertNode(node.left, newNode) }else{ node.left = newNode } }else{ if(node.right){ insertNode(node.right, newNode) }else{ node.
right = newNode } } } //插入節點方法 insert(value){ let node = new Node(value) if(this.root){ insertNode(this.root, node) }else{ this.root = node } }

前序遍歷

節點若存在,先列印該節點value,然後遞迴呼叫左子樹,最後遞迴呼叫右子樹

preOrder(node){
    if(node){
        console.log(node.value)
        this.preOrder(node.left)
        this.preOrder(node.right)
    }
}

中序遍歷

節點若存在,先遞迴呼叫左子樹,然後列印該節點value,最後遞迴呼叫右子樹

inOrder(node){
    if(node){
        this.midOrder(node.left)
        console.log(node.value)
        this.midOrder(node.right)
    }
}

後序遍歷

節點若存在,先遞迴呼叫左子樹,然後遞迴呼叫右子樹,最後列印該節點value

postOrder(node){
    if(node){
        this.postOrder(node.left)
        this.postOrder(node.right)
        console.log(node.value)
    }
}

完整程式碼

class Node{
    constructor (data){
        this.left = null
        this.right = null
        this.value = data
    }
}

class Tree{
    constructor (){
        this.root = null
    }
    //根據給出的父節點,判斷將新節點插在其左還是其右
    insertByFather(node, newNode) {
        if(newNode.value < node.value){
            if(node.left){
                insertNode(node.left, newNode)
            }else{
                node.left = newNode
            }
        }else{
            if(node.right){
                insertNode(node.right, newNode)
            }else{
                node.right = newNode
            }
        }
    }
    //建立並插入節點
    insert(value){
        let node = new Node(value)
        if(this.root){
            insertNode(this.root, node)
        }else{
            this.root = node
        }
    }
    //前序遍歷
    preOrder(node){
        if(node){
            console.log(node.valu)
            this.preOrder(node.left)
            this.preOrder(node.right)
        }
    }
    //中序遍歷
    inOrder(node){
        if(node){
            this.midOrder(node.left)
            console.log(node.value)
            this.midOrder(node.right)
        }
    }
    //後序遍歷
    postOrder(node){
        if(node){
            this.postOrder(node.left)
            this.postOrder(node.right)
            console.log(node.value)
        }
    }
}