算法基礎:二叉樹及常見遍歷方法

在計算機科學中,二叉樹是每一個結點最多有兩個子樹的樹結構。 一般子樹被稱做「左子樹」(left subtree)和「右子樹」(right subtree)。 二叉樹常被用於實現二叉查找樹和二叉堆。 一棵深度爲k,且有2^k-1個結點的二叉樹,稱爲滿二叉樹。javascript

講到二叉樹,它的先序遍歷、中序遍歷、後續遍歷和逐層遍歷是最多見的話題。先來看二叉樹的生成方法。html

// 節點對象的構造函數
function Node (data, left, right) {
    this.data = data
    this.left = left || null
    this.right = right || null
}

Node.prototype.getData = function () {
    return this.data
}

// 二叉樹的構造函數
function BST () {
    this.root = null
}

function insertNode (parentNode, newNode) {
    if (newNode.data < parentNode.data) {
        if (parentNode.left === null) {
            parentNode.left = newNode
        } else {
            insertNode(parentNode.left, newNode)
        }
    } else {
        if (parentNode.right === null) {
            parentNode.right = newNode
        } else {
            insertNode(parentNode.right, newNode)
        }
    }
}

// 插入方法
BST.prototype.insert = function (data) {
    const newNode = new Node(data, null, null)
    if (this.root === null) {
        this.root = newNode
    } else {
        insertNode(this.root, newNode)
    }
}

// 測試
var nums = new BST()
nums.insert(23)
nums.insert(45)
nums.insert(16)
nums.insert(37)
nums.insert(3)
nums.insert(99)
nums.insert(22)

接下來是二叉樹的前序遍歷、中序遍歷和後序遍歷。java

function preOrder (node, cb) {
    if (node !== null) {
        cb && cb(node.getData())
        preOrder(node.left, cb)
        preOrder(node.right, cb)
    }
}

function inOrder (node, cb) {
    if (node !== null) {
        inOrder(node.left, cb)
        cb && cb(node.getData())
        inOrder(node.right, cb)
    }
}

function postOrder (node, cb) {
    if (node !== null) {
        postOrder(node.left, cb)
        postOrder(node.right, cb)
        cb && cb(node.getData())
    }
}

// 先序遍歷二叉樹(先中間,而後左邊,而後右邊)
BST.prototype.preOrder = preOrder

// 中序遍歷二叉樹(先左邊,而後中間,而後右邊)
BST.prototype.inOrder = inOrder

// 後序遍歷二叉樹(先左邊,而後右邊,而後中間)
BST.prototype.postOrder = postOrder

nums.inOrder(nums.root, console.log)

// 依次輸出以下內容:
// 3
// 16
// 22
// 23
// 37
// 45
// 99


nums.preOrder(nums.root, console.log)

// 依次輸入以下內容:
// 23
// 16
// 3
// 22
// 45
// 37
// 99


nums.postOrder(nums.root, console.log)

// 依次輸入以下內容:
// 3
// 22
// 16
// 37
// 99
// 45
// 23

最後是二叉樹的逐層遍歷(從上往下逐層遍歷)。這裏只說一下思路。用上面的先序遍歷方法遍歷二叉樹,將遍歷到的內容一次加入一個隊列。最後再從隊頭開始打印隊列便可。node

注:原文連接:二叉樹及常見遍歷方法函數

相關文章
相關標籤/搜索