JavaScript实现二叉排序数

<!DOCTYPE html>
<html>
	<head>
		<title>BinaryTree</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;
			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);
					}
				}
			  }
			//添加数据
			this.insert = function(key){
				var newNode = new Node(key);
				if(root == null){
					root =newNode;
				}else{
					insertNode(root,newNode);
				}
			  }
			  //访问节点数据
			  var callback = function(key){
			  	console.log(key);
			  }

			  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);
			  }

			  var preOrderTraverseNode = function(node,callback){
			  	if (node!=null) {
			  		callback(node.key);
			  		preOrderTraverseNode(node.left,callback);
			  		preOrderTraverseNode(node.right,callback);
			  	}

			  }

			  //前序遍历
			  this.inOrderTraverse = function(callback){
			  	preOrderTraverseNode(root,callback);
			  }

			  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);
			  }

			  var searchNode = function(node,key){
			  	if(node == null){
			  		return false;
			  	}else if(key<node.key){
			  		searchNode(node.left,key);
			  	}else if(key>node.key){
			  		searchNode(node.right,key);
			  	}else{
			  		return true;
			  	}
			  }

			  //查找节点
			  this.search = function(key){
			  	return searchNode(root,key);
			  }

			  //找最小节点
			  var min = function(node){
			  	if(node){
			  		while(node && node.left!=null){
			  			node = node.left;
			  		}
			  		return node.key;
			  	}
			  	return null;
			  }

			  this.findMin = function(){
			  	return min(root);
			  }
			  //找最大节点
			  var max = function(node){
			  	if(node){
			  		while(node && node.right!=null){
			  			node = node.right;
			  		}
			  		return node.key;
			  	}
			  	return null;
			  }
			  
			  this.findMax = function(){
			  	return max(root);
			  }

			  //找到右子树中的最小值 用来替换
			  var findMinNode = function(node){
			  	if(node){
			  		while(node && node.left !=null){
			  			node = node.left;
			  		}
			  		return node;
			  	}
			  	return null;
			  }

			  //删除节点
			  var removeNode = function(node,key){
			  	if (node == null) {
			  		return null;
			  	}else if(key < node.key){
			  		return removeNode(node.left,key);
			  	}else if(key > node.key){
			  		return removeNode(node.right,key);
			  	}else{
			  		if(node.right==null&&node.left==null){
			  			node = null;
			  		}else if(node.left == null){
			  			return node.right;
			  		}else if(node.right == null){
			  			return node.left;
			  		}else{
			  			var preNode = findMinNode(node);
			  			node.key = preNode.key;
			  			return removeNode(node.right,preNode.key);
			  		}
			  	}
			  }

			  this.remove = function(key){
			  	return removeNode(root,key);
			  }
			}
			
		</script>
	</body>

</html>

猜你喜欢

转载自blog.csdn.net/qq_41750725/article/details/81107000
今日推荐