大前端演算法篇之二叉樹遍歷

要愛學習鴨發表於2022-02-14

二叉樹遍歷:

  1. 前序遍歷:先輸出當前節點;然後遍歷左子樹,如果左子樹不為空,遞迴前序遍歷;接著遍歷右子樹,如果右子樹不為空,遞迴前序遍歷
  2. 中序遍歷:先遍歷當前節點左子樹,如果不為空,遞迴中序遍歷;輸出當前節點,接著遍歷當前節點右子樹,如果不為空,遞迴中序遍歷
  3. 後序遍歷:先遍歷當前節點左子樹,如果不為空,遞迴後序遍歷;在遍歷當前節點右子樹,不過不為空,遞迴後序遍歷,輸出當前節點

怎麼區分何種遍歷,就是看當前節點的輸出順序


class HeroNode {
    constructor(no,name){
        this.no = no
        this.name = name
    }

    setLeft(left){
        this.left = left
    }

    setRight(right){
        this.right = right
    }
    toString(){
        console.log(this.name)
    }

    preOrder(){
        if(this.no == 2) {
            return false
        }
        if(this.left){
            this.left.preOrder()
        }
        
        if(this.right){
            this.right.preOrder()
        }
    }

    preOrderSearch(no){
        if(this.no == no) {
            return this
        }
        let res = null
        if(this.left){
            res = this.left.preOrderSearch(no)
        }
        if(res) return res
        if(this.right){
            return this.right.preOrderSearch(no)
        }
        return res
    }

    infixOrder(){
        if(this.left){
            this.left.infixOrder()
        }
        console.log(this.toString())
        if(this.right){
            this.right.infixOrder()
        }
    }

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

class BinaryTree {
    constructor(root){
        this.root = root
    }
    setRoot(root){
        this.root = root
    }
    preOrder(){
        if(this.root){
            this.root.preOrder()
        }
    }
    infixOrder(){
        if(this.root){
            this.root.infixOrder()
        }
    }
    postOrder(){
        if(this.root){
            this.root.postOrder()
        }
    }

    preOrderSearch(no){
        if(this.root){
            return this.root.preOrderSearch(no)
        }
    }
}


function exec(){
    // 建立二叉樹
    const bt = new BinaryTree()

    // 建立節點
    const root = new HeroNode(1,'劉備')
    const h2 = new HeroNode(2,'關羽')
    const h3 = new HeroNode(3,'張飛')
    const h4 = new HeroNode(4,'趙雲')

    root.setLeft(h2)
    root.setRight(h3)
    h3.setRight(h4)

    bt.setRoot(root)

    return bt.preOrderSearch(4)
}

console.log(exec())

 

相關文章