樹
二叉樹
二叉樹實現
tree.js
var Tree = function() {
var Node = function(value) {
this.value = value;
this.left = null;
this.right = null;
}
//根節點
var root = null;
var insertNode = function(node, newNode) {
if (newNode.value > node.value) {
//往右走
if (node.right == null) {
node.right = newNode
} else {
insertNode(node.right, newNode)
}
} else if (newNode.value < node.value) {
//往左走
if (node.left == null) {
node.left = newNode
} else {
insertNode(node.left, newNode)
}
}
}
// 插入節點
this.insert = function(value) {
var newNode = new Node(value)
if (root == null) {
//空樹
root = newNode
} else {
//不是空樹
insertNode(root, newNode)
}
}
// 搜尋節點
this.search = function(value) {
}
// 遍歷節點
this.traverse = function(value) {
}
// 刪除節點
this.remove = function(value) {
}
// 檢視根節點
this.getRoot = function() {
return root
}
}
複製程式碼
例項化
遍歷
後序遍歷
var Tree = function() {
var Node = function(value) {
this.value = value;
this.left = null;
this.right = null;
}
//根節點
var root = null;
var insertNode = function(node, newNode) {
if (newNode.value > node.value) {
//往右走
if (node.right == null) {
node.right = newNode
} else {
insertNode(node.right, newNode)
}
} else if (newNode.value < node.value) {
//往左走
if (node.left == null) {
node.left = newNode
} else {
insertNode(node.left, newNode)
}
}
}
// 插入節點
this.insert = function(value) {
var newNode = new Node(value)
if (root == null) {
//空樹
root = newNode
} else {
//不是空樹
insertNode(root, newNode)
}
}
// 搜尋節點
this.search = function(value) {
}
var traverse = function(node, callback) {
if (node == null) return
traverse(node.left, callback)
traverse(node.right, callback)
callback(node.value) //3 2 9 8 後續遍歷
}
this.traverse = function(callback) {
traverse(root, callback)
}
// 刪除節點
this.remove = function(value) {
}
// 檢視根節點
this.getRoot = function() {
return root
}
}
var t = new Tree()
t.insert(8)
t.insert(2)
t.insert(3)
t.insert(9)
var print = function(value) {
console.log('value - ', value)
}
t.traverse(print)
複製程式碼
中序遍歷
var traverse = function(node, callback) {
if (node == null) return
traverse(node.left, callback)
callback(node.value) //2 3 8 9 中序遍歷
traverse(node.right, callback)
}
複製程式碼
前序遍歷
var traverse = function(node, callback) {
if (node == null) return
callback(node.value) //8 2 3 9 前序遍歷
traverse(node.left, callback)
traverse(node.right, callback)
}
複製程式碼
獲取最小值
var min = function(node) {
if (!node) return null;
while (node && node.left) {
node = node.left
}
return node.value
}
this.min = function() {
return min(root)
}
複製程式碼
獲取最大值
var max = function(node) {
if (!node) return null;
while (node && node.right) {
node = node.right
}
return node.value
}
this.max = function() {
return max(root)
}
複製程式碼
刪除節點
刪除沒有子節點的節點
刪除只有一個子節點的節點
刪除有二個子節點的節點
程式碼實現
var findMinNode = function(node) {
if (node == null) return null
while (node && node.left) {
node = node.left
}
return node
}
var removeNode = function(node, value) {
if (node == null) return null
if (value > node.value) {
// 繼續向右查詢
node.right = removeNode(node.right, value)
return node
} else if (value < node.value) {
// 向左查詢
node.left = removeNode(node.left, value)
return node
} else {
// value == node.value
// 執行刪除過程
if (node.left == null && node.right == null) {
//葉節點條件
node = null
return node
}
// 只有一個子節點條件
console.log(node)
if (node.left == null && node.right) {
return node.right
} else if (node.right == null && node.left) {
return node.left
}
// 有兩個子節點的條件
var aux = findMinNode(node.right) //aux 查詢到的最小的子節點
node.value = aux.value
node.right = removeNode(node.right, aux.value)
return node
}
}
this.remove = function(value) {
root = removeNode(root, value)
}
複製程式碼