<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>BinaryTree</title>
</head>
<body>
</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没有左孩子
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) {
inOrderTraverseNode(root,callback);
};
var preOrderTraverseNode = function (node,callback) {
if (node!==null) {
callback(node.key);
preOrderTraverseNode(node.left,callback);
preOrderTraverseNode(node.right,callback);
}
};
//前序遍历 复制二叉树比重现插入。效率高
//当前结点先输出 然后遍历当前结点的左子树,然后遍历当前节点啊的右子树
this.preOrderTraverse = function (callback) {
preOrderTraverseNode(root,callback);
};
var postOrderTraverseNode =function (node,callback) {
if (node !== null){
postOrderTraverseNode(node.left,callback);
postOrderTraverseNode(node.right,callback);
callback(node.key);
}
};
//后续遍历 先访问左子树,然后访问右子树,最后访问节点
// 操作系统的文件系统的遍历
this.postOrderTraverse = function (callback) {
postOrderTraverseNode(root,callback);
};
var minNode = function (node) {
if (node) {
while (node && node.left !==null) {
node=node.left;
}
return node.key;
}
return null;
};
//二叉树的查找算法 左子树的所有节点小于当前节点,右子树的当前节点大于当前节点
//min 最小值
this.min=function () {
return minNode(root);
};
var maxNode = function (node) {
if (node) {
while (node && node.right !==null) {
node=node.right;
}
return node.key;
}
return null;
};
//max 最大值
this.max = function () {
return maxNode(root);
};
var searchNode= function (node,key) {
if (node ===null) {
return false;
}
if (key < node.left) {
return searchNode(node.left,key);
}else if (key > node.left) {
return searchNode(node.right,key);
}else {
return true;
}
};
//search 要查找的数值
this.search = function (key) {
return searchNode(root,key);
};
var findMinNode = function(node) {
if (node) {
while(node && node.left !==null){
node = node.left;
}
return node;
}
return null;
};
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;
return node;
}
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 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);
// binaryTree.preOrderTraverse(callback);
// binaryTree.postOrderTraverse(callback);
// console.log(binaryTree.min());
// console.log(binaryTree.max());
// console.log(binaryTree.search(7));
//binaryTree.remove(10);
</script>
</html>