数据结构-javascript实现排序二叉树

版权声明: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>

额外:

==和===区别
https://www.cnblogs.com/baizhanshi/p/4604257.html

猜你喜欢

转载自blog.csdn.net/qq_36762677/article/details/85332748
今日推荐