zoukankan      html  css  js  c++  java
  • 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>    
  • 相关阅读:
    极光推送SDK通过泰尔终端实验室检测,符合统一推送接口标准
    极光小课堂|手把手教你做接口测试
    一键登录怎么在iOS端实现?这篇文章教会你!
    一键登录已成大势所趋,Android端操作指南来啦!
    极光一键登录:更快捷、安全的登录认证方式,简单集成即可实现
    跨浏览器问题的五种解决方案
    Laravel 搭建 Composer 包,实现配置 Config、门面 Facade、服务 Service、发布到 Packagist
    How to Install ClamAV on Ubuntu 20.04 and Scan for Vulnerabilities
    单点登录(SSO)看这一篇就够了
    一口气说出 OAuth2.0 的四种授权方式
  • 原文地址:https://www.cnblogs.com/niusan/p/7528260.html
Copyright © 2011-2022 走看看