• js 二叉树算法


           //生成二叉树
            function binarySearchTree() {
                let Node = function(key) {
                    this.key = key;
                    this.left = null;
                    this.right = null;
                }
                let root = null;
                //插入一个节点
                this.insert = function(key) {
                        let newNode = new Node(key);
                        root == null ? (root = newNode) : (insertNode(root, newNode))
                    }
                //中序排列一个二叉树    对一个数组从小到大进行排序
                this.inOrderRraverse = function(callback) {
                        inOrderRraverseNode(root, callback);
                    }
                //获取最大值
                this.max = function() {
                        return findMaxNode(root);
                    }
                //获取最小值
                this.min = function() {
                        return findMinNode(root);
                    }
                //判断指定的值是否存在
                this.search = function(key) {
                        return searchNode(root, key);
                    }
                //删除指定的值
                this.remove = function(key) {
                    root = removeNode(root, key);
                }
            }
    
            function removeNode(node, key) {
                if (node === null) { //node等于null
                    return null;
                }
                if (key > node.key) { //node在右子树
                    node.right = removeNode(node.right, key);
                    return node;
                } else if (key < node.key) { //node在左子树
                    node.left = removeNode(node.left, key);
                    return node;
                } else { //node等于node.key
                    //没有子节点
                    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
                    }
                    //有两个子节点
                    //从右子树中找到一个最小的节点作为node的key,右子树相当于删除一个子节点
                    let aux = findMinNode(node.right);
                    node.key = aux;
                    node.right = removeNode(node.right, aux.key);
                    return node;
                }
    
            }
    
            function searchNode(node, key) {
                if (node != null) {
                    if (key > node.key) {
                        return searchNode(node.right);
                    } else if (key < node.key) {
                        return searchNode(node.left);
                    } else {
                        return true;
                    }
                } else {
                    return false;
                }
            }
    
            function findMaxNode(node) {
                if (node) {
                    while (node && node.right) {
                        node = node.right;
                    }
                    return node.key;
                } else {
                    return null;
                }
            }
    
            function findMinNode(node) {
                if (node) {
                    while (node && node.left) {
                        node = node.left;
                    }
                    return node.key;
                } else {
                    return null;
                }
    
            }
    
            function insertNode(node, newNode) {
                if (node.key > newNode.key) { //比父节点小,在左子树
                    node.left == null ? (node.left = newNode) : (insertNode(node.left, newNode))
                } else {
                    node.right == null ? (node.right = newNode) : (insertNode(node.right, newNode))
                }
            }
    
            function inOrderRraverseNode(node, callback) {
                if (node != null) {
                    inOrderRraverseNode(node.left, callback)
                    callback(node.key);
                    inOrderRraverseNode(node.right, callback)
                }
            }

    demo:

    let tree = new binarySearchTree();
            let arr = [20, 40, 60, 70, 50, 10, 15, 4, 7];
            arr.map(item => {
                tree.insert(item);
            });
            console.log(tree);
            let callback = function(key) {
                console.log(key);
            }
            tree.inOrderRraverse(callback);
            console.log('max++++>' + tree.max());
            console.log('min++++>' + tree.min());
            console.log('search++++>' + tree.search(5));
            tree.remove(20);
            tree.inOrderRraverse(callback);

    结果:

    参考来自:https://cloud.tencent.com/developer/article/1482473

  • 相关阅读:
    script Ngrinder_TestRunnerInsertMysqlSingle.groovy
    nGrinder TestRunnerInsertMysqlSingle.groovy
    列表导航栏实例(02)——精美电子商务网站赏析
    【网络编程】之九、事件选择WSAEventSelect
    注册界面设计(01)——精美电子商务网站赏析
    列表导航栏实例(04)——精美模板赏析
    【网络编程】之十、重叠IO Overlapped IO
    CSS大小设置实例——盒子模型
    常用数据验证正则表达式释义(附:正则表达式常用符号)
    【网络编程】之八、异步选择WSAAsyncSelect
  • 原文地址:https://www.cnblogs.com/xiaofenguo/p/11724547.html
Copyright © 2020-2023  润新知