//搜索二叉树类
function BinarySearchTree(){
var Node = function(key){ //声明一个Node类来表示树中的每个节点
this.value = key;
this.left = null;
this.right = null;
};
var root = null;// 根元素
//插入搜索二叉树
this.insert = function(key){//要向树中插入一个新的节点(或项),要经历三个步骤
var newNode = new Node(key);//第一步是创建用来表示新节点的Node类实例
if(root == null){
root = newNode;//第二步,判断要插入的节点是否是树的第一个节点,如果是,就将根节点指向新节点。
}else{
insertNode(root,newNode);//第三步是将节点加在非根节点的其他位置
}
};
//插入非根节点的辅助函数
var insertNode = function(node,newNode){
if(newNode.value < node.value){
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.getRoot = function(){
return root;
};
// 中序遍历二叉树(根节点中间遍历,从小到大)
this.inOrderTraverse = function(inOrderCallback){
inOrderTraverseNode(root,inOrderCallback);
};
var inOrderTraverseNode = function(node,callback){
if(node != null){
inOrderTraverseNode(node.left,callback);
callback(node.value);
inOrderTraverseNode(node.right,callback);
}
}
// 前序遍历二叉树
this.preTraverse = function(preCallback){
preTraverseNode(root,preCallback);
};
var preTraverseNode = function(node,callback){
if(node != null){
callback(node.value);
preTraverseNode(node.left,callback);
preTraverseNode(node.right,callback);
}
}
// 后序遍历二叉树
this.postTraverse = function(postCallback){
postTraverseNode(root,postCallback);
};
var postTraverseNode = function(node,callback){
if(node != null){
postTraverseNode(node.left,callback);
postTraverseNode(node.right,callback);
callback(node.value);
}
}
}
// 搜索二叉树使用
var tree = new BinarySearchTree();
var treeArr = [11,7,5,3,9,8,10,13,12,14,20,18,25];
for(var i=0;i<treeArr.length;i++){
tree.insert(treeArr[i]);
}
var inorder = [],
pre = [],
post = [];
var inorderprintfun = function(key){
inorder.push(key);
};
var preprintfun = function(key){
pre.push(key);
};
var postprintfun = function(key){
post.push(key);
};
tree.inOrderTraverse(inorderprintfun);
tree.preTraverse(preprintfun);
tree.postTraverse(postprintfun);
console.log('中序遍历')
console.log(inorder);
console.log('前序遍历')
console.log(pre);
console.log('后序遍历')
console.log(post);