版权声明:fromZjy QQ1045152332 https://blog.csdn.net/qq_36762677/article/details/85332748
二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。
结构图
涉及功能
- 插入操作
- 中序遍历(左根右/按顺序输出)
- 前序遍历(根左右/复制二叉树)
- 后序遍历(左右根)
- 查找算法(查找效率高)
- 找最小值(最左边叶子节点),最大值(最右叶子节点)
- 删除节点
源码
<!DOCTYPE html>
<html>
<head>
<title>Binary Tree</title>
</head>
<body>
<script type="text/javascript">
function BinaryTree(){
//二叉树结构
var Node = function(key){
this.key = key;
this.left = null;
this.right = null;
};
//定义根节点
var root = null;
//插入==========================
this.insert = function(key){//接口
var newNode = new Node(key);
if (root == null){
root = newNode;
} else {
insertNode(root, newNode);
}
};
var insertNode = function(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);
}
}
};
//插入end=====================
//中序遍历==========================
var inOrderTraverseNode = function(node, callback){
if (node !==null){
inOrderTraverseNode(node.left, callback);
callback(node.key);
inOrderTraverseNode(node.right, callback);
}
}
this.inOrderTraverse = function(callback){//接口
inOrderTraverseNode(root, callback)
}
//中序遍历end==========================
//前序遍历==========================
var preOrderTraverseNode = function(node, callback){
if (node !==null){
callback(node.key);
preOrderTraverseNode(node.left, callback);
preOrderTraverseNode(node.right, callback);
}
}
this.preOrderTraverse = function(callback){//接口 回调函数作为参数
preOrderTraverseNode(root, callback)
}
//前序遍历end==========================
//后序遍历==========================
var postOrderTraverseNode = function(node, callback){
if (node !==null){
postOrderTraverseNode(node.left, callback);
postOrderTraverseNode(node.right, callback);
callback(node.key);
}
}
this.postOrderTraverse = function(callback){//接口 回调函数作为参数
postOrderTraverseNode(root, callback)
}
//后序遍历end==========================
//查找最小值==========================
this.min = function(){
return minNode(root);
}
var minNode = function(node){
if (node){
while(node && node.left !== null){
node = node.left;
}
return node.key;//返回数值
}
return null;
}
var findMinNode = function(node){//返回对象
if (node){
while(node && node.left !== null){
node = node.left;
}
return node;
}
return null;
}
//查找最小值end==========================
//查找最大值==========================
this.max = function(){
return maxNode(root);
}
var maxNode = function(node){
if (node){
while(node && node.right !== null){
node = node.right;
}
return node.key;
}
return null;
}
//查找最大值end==========================
//查找值是否存在==========================
this.search = function(key){
return searchNode(root, key);
}
var searchNode = function(node, key){
if (node === null){
return false;
}
if (key < node.key){
return searchNode(node.left, key);
} else if (key > node.key){
return searchNode(node.right, key);
} else {
return true;
}
}
//查找值是否存在end==========================
//删除节点==========================
this.remove = function(key){
root = removeNode(root, key);
}
var removeNode = function(node, key){
if (node === null){
return null;
}
if (key < node.key){
node.left = removeNode(node.left, key)
return node;
} else if (key > node.key){
node.right = removeNode(node.right, key);
return node;
} else {
if (node.left === null && node.right === null){
node = null;
return node;
}
if (node.left === null){//只有右子树
node = node.right;
return node;
} else if (node.right === null){
node = node.left;
return node;
}
//含有两个孩子节点
var aux = findMinNode(node.right);//找到右子树最小节点(最左节点)
node.key = aux.key;//最小值赋值给当前node
node.right = removeNode(node.right, aux.key);//从右子树中删除旧节点
return node;
}
}
//删除节点end==========================
}
//数组
var nodes = [8, 3, 10, 1, 6, 14, 4, 7, 13];
//构造二叉树
var binaryTree = new BinaryTree();
nodes.forEach(function(key){
binaryTree.insert(key);
});
//回调函数
var callback = function(key){
console.log(key);
}
console.log("中序遍历");
binaryTree.inOrderTraverse(callback);
//console.log("前序遍历");
//binaryTree.preOrderTraverse(callback);
//console.log("后序遍历");
//binaryTree.postOrderTraverse(callback);
console.log("min :" + binaryTree.min());
console.log("max :" + binaryTree.max());
console.log("1 is have :" + binaryTree.search(1));
console.log("9 is have :" + binaryTree.search(9));
binaryTree.remove(4);
binaryTree.inOrderTraverse(callback);
</script>
</body>
</html>