在計算機科學中,二叉樹是每一個結點最多有兩個子樹的樹結構。 一般子樹被稱做「左子樹」(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
注:原文連接:二叉樹及常見遍歷方法函數