1、特点:
(1)、每个节点都有两个子节点 (2)、左侧节点小于右侧节点
2、实现
(1)实现插入函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
</html>
<script>
function Tree() {
function Node(value) {
this.value = value
this.left = null
this.right = null
}
var root = null
function traverse(node, callback) {
if (node == null) return false
traverse(node.left, callback)
traverse(node.right, callback)
callback(node.value)
}
//遍历节点
this.traverse = function (callback) {
traverse(root, callback)
}
function insertNode(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.getRoot = function () {
return root
}
function min(node) {
if (node == null) return null
while (node && node.left) {
node = node.left
}
return node.value
}
//获取节点最小值
this.min = function () {
return min(root)
}
function max(node) {
if (node == null) return null
while (node && node.right) {
node = node.right
}
return node.value
}
//获取节点最大值
this.max = function () {
return max(root)
}
function removeNode(node, value) {
if (node === null) return null
if (value > node.value) {
node.right = removeNode(node.right, value)
} else if (value < node.value) {
node.left = removeNode(node.left, value)
} else {
//执行删除过程
if (node.left === null && node.right === null) {
node = null
return node
}
//只有一个子节点的条件
if (node.left === null && node.right) {
node = null
return node.right
} else if (node.right === null && node.left) {
node = null
return node.left
}
}
}
//删除节点
this.remove = function (value) {
root = removeNode(root, value)
}
}
var t = new Tree
t.insert(8)
t.insert(2)
t.insert(9)
t.insert(3)
console.log(t.getRoot())
t.traverse(function (value) {
console.log(value)
})
console.log(t.min())
console.log(t.max())
</script>