在計算機科學中,二叉樹是每一個結點最多有兩個子樹的樹結構。一般子樹被稱做「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用於實現二叉查找樹和二叉堆。 一棵深度爲k,且有2^k-1個節點的二叉樹,稱爲滿二叉樹。這種樹的特色是每一層上的節點數都是最大節點數。而在一棵二叉樹中,除最後一層外,若其他層都是滿的,而且最後一層或者是滿的,或者是在右邊缺乏連續若干節點,則此二叉樹爲徹底二叉樹。具備n個節點的徹底二叉樹的深度爲floor(log2n)+1。深度爲k的徹底二叉樹,至少有2k-1個葉子節點,至多有2k-1個節點。。node
function BinaryTree () {
//建立對象
class Node {
constructor (key) {
this.key = key
this.left = null
this.right = null
}
}
//初始化root
let root = null
const insertNode = (node, newNode) => {
if (newNode.key < node.key) {
if (node.left === null) {
node.left = newNode
} else {
insertNode(node.left, newNode)
}
} else {
if (node.right === null) {
node.right = newNode
} else {
insertNode(node.right, newNode)
}
}
}
this.insert = (item) =>{
let newNode = new Node(item)
if (root === null) {//判斷是否有根節點
root = newNode
} else {
insertNode(root, newNode)//調用二叉處理方法
}
}
//中序排序
const inOrderTraverseNode = (node, callback) => {
if (node !== null) {
inOrderTraverseNode(node.left, callback)
callback(node.key)
inOrderTraverseNode(node.right, callback)
}
}
//前序遍歷
const preOrderTraverseNode = (node, callback) => {
if (node !== null) {
callback(node.key)
preOrderTraverseNode(node.left, callback)
preOrderTraverseNode(node.right, callback)
}
}
//後序遍歷
const postOrderTraverseNode = (node, callback) => {
if (node !== null) {
postOrderTraverseNode(node.left, callback)
postOrderTraverseNode(node.right, callback)
callback(node.key)
}
}
this.allOrderTraverse = (callback, FuncName) => {//入口函數
switch (FuncName) {
case 'inOrderTraverseNode': inOrderTraverseNode(root, callback)
break
case 'preOrderTraverseNode': preOrderTraverseNode(root, callback)
break
case 'postOrderTraverseNode' : postOrderTraverseNode (root, callback)
break
default: alert('輸入錯誤,請輸入:inOrderTraverseNode,preOrderTraverseNode,postOrderTraverseNode 中的一種 ')
break;
}
}
}
let nodes = [8, 3, 10, 1, 6, 14, 4, 7, 13]
var BinaryTree = new BinaryTree()
nodes.forEach(function (key) {
BinaryTree.insert(key)
})
BinaryTree.allOrderTraverse(key => {console.log(key)}, 'postOrderTraverseNode')
複製代碼
script
標籤中 斷點調試Node
初始化的節點對象 它包含 left
right
屬性insert
判斷是否有根節點,沒有的話初始化當前的key爲根節點left
和 right
是否爲空 爲空的話讓其賦值left
大於的 放 right
小於
|| 大於
又不爲空的狀況 那就遞歸執行 insterNode(newNode.left || right , newNode)
置到 能給子節點賦值爲止//中序排序
const inOrderTraverseNode = (node, callback) => {
if (node !== null) {
inOrderTraverseNode(node.left, callback)
callback(node.key)
inOrderTraverseNode(node.right, callback)
}
}
複製代碼
//前序遍歷
const preOrderTraverseNode = (node, callback) => {
if (node !== null) {
callback(node.key)
preOrderTraverseNode(node.left, callback)
preOrderTraverseNode(node.right, callback)
}
}
複製代碼
//後序遍歷
const postOrderTraverseNode = (node, callback) => {
if (node !== null) {
postOrderTraverseNode(node.left, callback)
postOrderTraverseNode(node.right, callback)
callback(node.key)
}
}
複製代碼