<!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>