排序二叉树
如上图为典型的排序二叉树,左孩子的值比节点的值小,右孩子的值比节点的值大,关于具体的树的定义及二叉树的定义可以百度或查阅相关资料。
排序二叉树的创建
- 创建原理
排序二叉树的创建原理与排序二叉树的定义一致,即左孩子的值比当前节点的值小,右孩子的值比当前节点的值大。 - 代码实现
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>binary-tree</title>
<link rel="stylesheet" href="">
</head>
<body>
<script type="text/javascript" charset="utf-8">
//创建一个排序二叉树
//
function BinaryTree() {
//节点类
var Node = function(key) {
this.key = key
this.left = null
this.right = null
}
// 根节点
var root = null
// 1
var insertNode = function(node, newNode) {
if(node !== null) {
if(newNode.key < node.key) {
insertNode(node.left, newNode)
if(node.left == null) {
node.left = newNode
}
}else{
insertNode(node.right, newNode)
if(node.right == null) {
node.right = newNode
}
}
}
return null
}
//插入节点
this.insert = function(key) {
var newNode = new Node(key)
if(root === null) {
root = newNode
}else {
insertNode(root, newNode)
}
}
this.getTree = function() {
return root
}
}
var tree = new BinaryTree()
var nodes = [8, 3, 10, 1, 6, 14, 4, 7, 11, 15]
nodes.forEach(function(item) {
tree.insert(item)
})
console.log(tree.getTree())
</script>
</body>
</html>
以上便是创建排序二叉树的实现方式:
重点在于插入节点的具体实现,即注释1的代码片段。
其中比较难理解的点在于递归是如何执行,
取当前的节点为{key: 1, left:null, right:null},则当前树如下图:
对该树进行插入
var insertNode = function(node, newNode) {
if(node !== null) {
if(newNode.key < node.key) {
insertNode(node.left, newNode)
if(node.left == null) {
node.left = newNode
}
}else{
insertNode(node.right, newNode)
if(node.right == null) {
node.right = newNode
}
}
}
return null
}
首先由根节点8出发,进入node的key为8的栈内1比根节点8要小,进入递归,即进入到了node的key为3的栈内,如下所示:
3
-----------------
8
--------------------------
当前的值比3小再进入3的左孩子null的栈内
null
------------
3
-----------------
8
--------------------------
由于null的栈内,node为null,立即退出当前栈,返回至node的key为3的栈,发现左孩子为null,则将key为1的node变成key为3的node的左孩子,同时退出3的栈,返回至8的栈,8的栈左孩子不null,不做任何操作,知道当前方法执行完毕,跳出8的栈,返回至方法所在的执行环境的栈,节点插入完毕,再进行下一个节点的插入,操作则同上。以上的解释,如果配合上浏览器的断点调试,食用更佳,更好理解程序的整个执行过程。
当所有节点插入完毕之后,该排序二叉树也创建完毕。
二叉树创建完毕之后则可对二叉树进行相关的操作(遍历,查找,节点删除等)【待续】
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。