JS数据结构(七)——树

163 阅读1分钟

一:创建树并插入值

function BinarySearchTree(){
	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);
			}
		}
	};

}

二:中序遍历

//树的遍历-中序遍历
	this.inOrderTravese = function(callback){
		inOrderTraveseNode(root,callback);
	}
	var inOrderTraveseNode = function(node, callback){
		if(node !== null){
			inOrderTraveseNode(node.left,callback);
			callback(node.key);
			inOrderTraveseNode(node.right,callback);
		}
	}

三:搜索最小值

//搜索最小和最大值
	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;
	}

四:搜索特定值

//搜索一个特定的值
	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;
		}
	}

五:移除节点

//移除一个节点
	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{ //键等于key
			//第一种情况——一个叶节点
			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.right = removeNode(node.right, aux.key);
			return node;
		}
	}
	var findMinNode = function(node){
		while(node && node.left !== null){
			node = node.left;
		}
		return node;
	}

二叉树的深度

//二叉树的深度
function deep(root){
	var depth = 0,currentDepth = 0;
	dfs(root);
	function dfs(root){
		if(root == null){
			depth = depth > currentDepth ? depth : currentDepth;
			return;
		}
		currentDepth++;
		dfs(root.left);
		dfs(root.right);
		currentDepth--;
	}
	return depth;
}