二叉樹:在計算機科學中,二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree)。二叉樹常被用於實現二叉查找樹和二叉堆。
首先我們這張圖的二叉樹的頂端爲八,也被稱爲根節點
1, 6 則是兄弟節點,同屬於3的節點
最底層的4, 7, 13, 則被稱爲終點節點,又名葉子節點,
散佈邏輯
以8作爲根節點爲例,小於8的則是左子樹,大於八的則是右子樹,然後然後左右子樹在以此類推,
代碼實現邏輯
首先我們我們肯定會有個創建根節點的構造函數,和創建子節點的構造函數
建議在chrome下運行,此處打了三個debugger,可以看一下代碼的執行順序,然後看執行時的值
//這裏爲創建子節點的構造函數
class BinaryNode {
constructor(node) {
this.node = node
this.right = null
this.left = null
}
}
//這裏是創建根節點的構造函數
class BinaryTree {
constructor() {
//這裏爲根節點
this.root = null
}
insert(newNode) {
debugger
//這裏是創建節點
var newNode = new BinaryNode(newNode)
//如果已經存在根節點
if (this.root) {
//這裏是往根節點賦值
this.insertNode(this.root, newNode)
} else {
//沒有根節點就直接賦值給根節點
this.root = newNode
}
}
insertNode(node, newNode) {
debugger
//node爲上一層根節點,
//比較值,如果上層節點大於新的值,則往左子樹賦值
if (node.node > newNode.node) {
//這裏是沒有左子樹則直接賦值
if (node.left === null) {
node.left = newNode
} else {
//如果左子樹有值, 則重新調用此函數,
this.insertNode(node.left, newNode)
}
} else {
if (node.right === null) {
node.right = newNode
} else {
this.insertNode(node.right, newNode)
}
}
}
}
代碼邏輯寫完了 那我們試着調用以下構造函數
var nodes = [8, 1, 3, 6, 7, 4, 10, 14, 13]
var binaryTree = new BinaryTree()
nodes.forEach(node => {
debugger
binaryTree.insert(node)
})
console.log(binaryTree.root) //看下圖
這是執行完forEach時的結果,順序展開後和我們最上面的圖則是完全一樣的;