一:创建树并插入值
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;
}