zoukankan      html  css  js  c++  java
  • js树形结构-----(BST)二叉树增删查

    function BinarySearchTree(){
    			var cnodes = function(key){
    				this.key = key;
    				this.left = null;
    				this.right = null;
    			}
    			
    			var root = null;
    			
    			this.insert = function(key){
    				var nodes = new cnodes(key);
    				if(root === null){
    					root = nodes;
    				}else{
    					insertNode(root,nodes);
    				}
    			}
    			
    			function insertNode(rnode,newnode){
    				if(newnode.key  <  rnode.key){
    					if(rnode.left  === null){
    						rnode.left = newnode;
    					}else{
    						insertNode(rnode.left,newnode);
    					}
    				}else{
    					if(rnode.right === null){
    						rnode.right = newnode;
    					}else{
    						insertNode(rnode.right , newnode );
    					}
    				}
    			}
    			
    			//中序遍历
    			this.inOrderTraverse = function(callback){
    				inOrderTraverseNode(root, callback);
    				};
    			function inOrderTraverseNode(cnode,callback){
    				if(cnode !== null){
    					inOrderTraverseNode(cnode.left,callback );
    					callback(cnode.key);
    					inOrderTraverseNode(cnode.right,callback );
    				}
    			}
    			
    			//先序遍历
    			this.preOrderTraverse = function(callback){
    				preOrderTraverseNode(root, callback);
    			};
    			var preOrderTraverseNode = function (node, callback) {
    				if (node !== null) {
    				callback(node.key); 
    					preOrderTraverseNode(node.left, callback); 
    					preOrderTraverseNode(node.right, callback); 
    				}
    			};
    			
    			//后序遍历
    			this.postOrderTraverse = function(callback){
    				postOrderTraverseNode(root, callback);
    			};
    			function postOrderTraverseNode(cnode, callback){
    				if(cnode !== null){
    					postOrderTraverseNode(cnode.left, callback);
    					postOrderTraverseNode(cnode.right, callback);
    					callback(cnode.key);
    				}
    			}
    			
    			//搜索最小值
    			this.min = function(){
    				return minNode(root);
    			};
    			
    			function minNode(cnode){
    				if(cnode){
    					while(cnode && cnode.left !== null){
    						cnode = cnode.left;	
    					}
    					return cnode.key;
    				}
    				return null;
    			}
    			
    			this.max = function(){
    				return maxNode(root);
    			}
    			function maxNode(cnode){
    				if(cnode){
    					while(cnode && cnode.right !== null){
    						cnode = cnode.right;
    					}
    					return cnode.key;
    				}
    				return null;
    			}
    			
    			this.search = function(key){
    				return searchNode(root,key);	
    			};
    			
    			function searchNode(cnode,key){
    				if(cnode === null){
    					return false;
    				}
    				
    				if(key < cnode.key){
    					return searchNode(cnode.left,key);
    				}else if(key > cnode.key){
    					return searchNode(cnode.right,key);
    				}else{
    					return true;
    				}
    			}
    			
    			//删除
    			this.remove = function(key){
    				root = removeNode(root,key);
    			};
    			
    			function removeNode(cnode,key){
    				if(cnode == null){
    					return null;
    				}
    				if(key < cnode.key){
    					cnode.left = removeNode(cnode.left , key);
    					return cnode;
    				}else if(key  > cnode.key){
    					cnode.right = removeNode(cnode.right , key);
    					return cnode;
    				}else{
    					//等于的时候
    					//第一种情况,一个叶节点
    					if(cnode.left === null && cnode.right === null){
    						cnode = null;
    						return cnode;
    					}
    					
    					//第二种情况,一个子节点
    					if(cnode.left === null){
    						cnode = cnode.right;
    						return cnode;
    					}else if(cnode.right === null){
    						cnode = cnode.left;
    						return cnode;
    					}
    					//第三种情况,两个子节点
    					//1找到要删除的节点
    					//2找到该节点,右侧子树中的最小节点,替换自己
    					//3删掉右侧子树中的最小节点
    					var aux = findMinNode(cnode.right);
    					cnode.key = aux.key;
    					cnode.right = removeNode(cnode.right,aux.key);
    					return cnode;
    				}
    			}
    			var findMinNode = function(node){
    				//右侧子树中最小节点的键去更新这个节点的值
    				while (node && node.left !== null) {
    					node = node.left;
    					}
    				return node;
    			};
    		}
    		
    		var tree  = new BinarySearchTree();
    		tree.insert(11);
    		tree.insert(7);
    		tree.insert(15);
    		tree.insert(5);
    		tree.insert(3);
    		tree.insert(9);
    		tree.insert(8);
    		tree.insert(10);
    		tree.insert(13);
    		tree.insert(12);
    		tree.insert(14);
    		tree.insert(20);
    		tree.insert(18);
    		tree.insert(25);
    		tree.insert(6);
    		
    		tree.inOrderTraverse(function(key){
    			console.log(key);
    		});
    		tree.remove(15);
    		console.log("-----------");
    		tree.inOrderTraverse(function(key){
    			console.log(key);
    		});
    

      

  • 相关阅读:
    LINUX下文件编译
    Circle HDU
    Tree HDU
    Can you answer these queries? HDU
    Function HDU
    牛客练习赛46 A 华华教奕奕写几何 (简单数学)
    牛客练习赛26 E-树上路径 (树链剖分+线段树)
    Flight HDU
    牛客练习赛47 D DongDong坐飞机 (分层最短路)
    洛谷 P3384 【模板】树链剖分
  • 原文地址:https://www.cnblogs.com/muamaker/p/9204258.html
Copyright © 2011-2022 走看看