排序二叉树全部代码

<!DOCTYPE html>
<html>
<head>
	<title></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 inOrderTraverseNode = function(node,callback){//中序遍历函数
			if(node!==null){
				inOrderTraverseNode(node.left,callback);
				callback(node.key);
				inOrderTraverseNode(node.right,callback);
			}
		};
		this.inOrderTraverse = function(callback){ //中序遍历,原理从根节点先遍历左子树,按左中右的方式斤进行遍历i
			inOrderTraverseNode(root,callback);
		};
		var preOrderTraverseNode = function(node,callback){//前序遍历
			if(node!==null){
				callback(node.key);
				inOrderTraverseNode(node.left,callback);
				inOrderTraverseNode(node.right,callback);
			}
		};
		this.preOrderTraverse = function(callback){//前序遍历
			preOrderTraverseNode(root,callback);
		};
		var minNode = function(node){
			if(node){
				while(node && node.left !==null){ //node存在而且node的右孩子也存在就一直循环
					node=node.left;
				}
				return node.key;
			}
		};
		this.min = function(){
			return minNode(root);
		};
		var maxNode = function(node){
			if(node){
				while(node && node.right !==null){
					node=node.right;
				}
				return node.key;
			}
		};
		this.max = function(){
			return maxNode(root);
		};
		var serachNode = function(node,key){//查找二叉树中是否存在指定节点,存在返回True,否则返回false;
			if(node === null){
				return false;
			}
			if(key<node.key){
				return serachNode(node.left,key);
			} else if(key>node.key){
				return serachNode(node.right,key);
			} else{
				return true;
			}
		};
		this.serach = function(key){
			if(serachNode(root,key)){
				return true;
			}else{
				return false;
			}
		};
		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;
				}
				//如果以上条件都不符合,即又存在左孩子,也存在右孩子。
				var aux = findMinNode(node.right);
				node.key = aux.key;
				node.right = removeNode(node.right,aux.key);
				return node;
			}
		};
		this.remove = function(key){
			root = removeNode(root,key);
		}
		var findMinNode = function(node){//用于第三种情况找到右子树的最小节点。
			if(node){
				while(node&&node.left!==null){
					node = node.left;
				}
				return node;
			}
			return null;
		};
	}

	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);
	}
	binaryTree.inOrderTraverse(callback);
	console.log("min node is :"+binaryTree.min());
	console.log("min node is :"+binaryTree.max());
	console.log(binaryTree.serach(7)?'key 7 is found':'key 7 is not found');
	console.log(binaryTree.serach(9)?'key 9 is found':'key 9 is not found');
	binaryTree.remove(3);
	</script>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值