zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    vue(七)--监听属性(watch)
    vue(六)--计算属性(computed)
    JVM参数配置&&命令工具
    GC回收算法&&GC回收器
    JVM宏观认知&&内存结构
    分布式配置中心Apollo——QuickStart
    了解敏捷开发
    服务链路跟踪 && 服务监控
    数据读写API——IO流
    Nginx+Zuul集群实现高可用网关
  • 原文地址:https://www.cnblogs.com/xiaofenguo/p/11724547.html
Copyright © 2011-2022 走看看