Javascript二叉树算法学习

<!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>    
原文地址:https://www.cnblogs.com/niusan/p/7528260.html