JavaScript数据结构之-树

栏目: 数据库 · 发布时间: 5年前

内容简介:树一种分层次的数据结构。它是由一个或者多个节点组成由层次关系的集合。之所以称之为树,是因为看它外形像一颗倒挂的树。根朝上,叶朝下。由若干个节点组成,没有父节点的节点称之为根节点。一个节点只有一个父节点,一个父节点由若干个子节点。节点的左子节点小于父节点,节点的右子节点大于父节点。二叉树结合了数据查询的优化和链表插入删除的优点。在处理大量动态数据时非常有用。有助于更高效的对数据进行查询、插入、删除。

树一种分层次的数据结构。它是由一个或者多个节点组成由层次关系的集合。之所以称之为树,是因为看它外形像一颗倒挂的树。根朝上,叶朝下。由若干个节点组成,没有父节点的节点称之为根节点。一个节点只有一个父节点,一个父节点由若干个子节点。

JavaScript数据结构之-树

2、二叉搜索树(BST)

节点的左子节点小于父节点,节点的右子节点大于父节点。

2.1、实现二叉搜索树的遍历、新增、查询、删除

function BinarySearchTree(){
        // 根节点初始化
        var root = null;
        // 创建节点类
        var Node = function(key) {
            this.key = key;
            this.left = null;
            this.right = null;
        };
        // 创建节点
        this.insert = function(key) {
            var node = new Node(key);
            if (root === null) {
                root = node;
            } else {
                insertNode(root, node);
            }
        };
        // 查找最小值
        this.min = function() {
            var node = root;
            if (node) {
                while (node && node.left !== null) {
                    node = node.left;
                }
                return node.key;
            }
            return null;
        };
        // 查找最大值
        this.max = function() {
            var node = root;
            if (node) {
                while (node && node.right !== null) {
                    node = node.right;
                }
                return node.key;
            }
            return null;
        };
        // 查找特定的值
        this.search = function(key) {
            return searchNode(root, key);
        };
        // 删除指定节点
        this.remove = function(key) {
            root = removeNode(root, key);
        };
        // 中序遍历
        this.inOrderTraverse = function(callback) {
            inOrderTraverseNode(root, callback);
        };
        // 先序遍历
        this.preOrderTraverse = function(callback) {
            preOrderTraverseNode(root, callback);
        };
        // 后续遍历
        this.postOrderTraverse = function(callback) {
            postOrderTraverseNode(root, callback);
        };
        // 创建节点辅助类
        function insertNode(root, node) {
            if (node.key < root.key) {
                if (root.left === null) {
                    root.left = node;
                } else {
                    insertNode(root.left, node);
                }
            } else {
                if (root.right === null) {
                    root.right = node;
                } else {
                    insertNode(root.right, node);
                }
            }
        }
        // 查找特定值辅助类
        function searchNode(node, key) {
            if (node) {
                if (key < node.key) {
                    return searchNode(node.left, key);
                } else if (key > node.key){
                    return searchNode(node.right, key);
                } else {
                    return true;
                }
            } else {
                return false;
            }
        }
        // 删除指定值辅助类
        function removeNode(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;
            }
        }
        // 查找节点的最小值节点
        function findMinNode(node) {
            while(node && node.left) {
                node = node.left;
            }
            return node;
        }
        // 中序遍历
        function inOrderTraverseNode(node, callback) {
            if(node) { 
                inOrderTraverseNode(node.left, callback);
                callback(node.key);
                inOrderTraverseNode(node.right, callback);
            }
        }
        // 先序遍历
        function preOrderTraverseNode(node, callback) {
            if(node) { 
                callback(node.key);
                preOrderTraverseNode(node.left, callback);
                preOrderTraverseNode(node.right, callback);
            }
        }
        // 后序遍历
        function postOrderTraverseNode(node, callback) {
            if(node) { 
                preOrderTraverseNode(node.left, callback);
                preOrderTraverseNode(node.right, callback);
                callback(node.key);
            }
        }
    }
    var tree = new BinarySearchTree();
    tree.insert(11);
    tree.insert(7);
    tree.insert(15);
    tree.insert(5);
    tree.insert(3);
    tree.insert(9);
    tree.insert(8);
    tree.insert(10);
    tree.insert(10);
    tree.insert(13);
    tree.insert(12);
    tree.insert(14);
    tree.insert(20);
    tree.insert(18);
    tree.insert(25);
    function printNode(value) {
        console.log(value);
    }
    // tree.inOrderTraverse(printNode);
    // tree.preOrderTraverse(printNode);
    // tree.postOrderTraverse(printNode);
    var min = tree.min();
    var max = tree.max();
    var search = tree.search(7);
    tree.remove(10);
    tree.inOrderTraverse(printNode);
复制代码

3、二叉搜索树(BST)优点

二叉树结合了数据查询的优化和链表插入删除的优点。在处理大量动态数据时非常有用。有助于更高效的对数据进行查询、插入、删除。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

让创意更有黏性

让创意更有黏性

[美] 奇普·希思、[美] 丹·希思 / 姜奕晖 / 中信出版社 / 2014-1-8 / 49.00元

你或许相信在太空中唯一能看到的人工建筑就是万里长城,可乐能腐蚀人体骨骼,我们的大脑使用了10%;与此同时,你却记不得上周例会上领导的安排,昨天看过的那本书里写了什么,上次参加培训的主要内容…… 为什么? 这就引发出《让创意更有黏性》的核心问题:什么样的观点或创意具有强有力的黏性,能被他人牢牢记住? 国际知名行为心理学家希思兄弟根据大量的社会心理学研究案例,揭示了让创意或观点具有黏......一起来看看 《让创意更有黏性》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具