【JavaScript】JavaScript数据结构与算法 —— 二叉树

       树是计算机科学中经常用到的一种数据结构。树是非线性的数据结构,以分成的方式存储数据,树被用来存储具有层级关系的数据,比如文件系统的文件,树还被用来存储有序列表。我们要研究的是二叉树,在二叉树上查找元素非常快,为二叉树添加元素或者删除元素,也是非常快的。我们现在就来学习二叉树,二叉树是一种特殊的树,它的特征是子节点个数不超过2个,相对较少的值保存在左节点上,较大的值保存在右节点中。这一特性使得查找的效率非常高。

  • 二叉树是由节点组成的,下面对这种结构使用javascript实现增加、查询(最大、最小以及等于)、删除等操作。整体代码如下:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    </body>
    <script>
        function Node(data,left,right) {
            this.data = data;
            this.left = left;
            this.right = right;
            this.show = show;
            this.find = find;
        }
        function show() {
            return this.data;
        }
        function BST() {
            this.root = null;
            this.insert = insert;
            this.inOrder = inOrder;
            this.preOrder = preOrder;
            this.postOrder = postOrder;
            this.getMin = getMin;
            this.getMax = getMax;
            this.find = find;
            this.remove = remove;
        }
        function insert(data) {
            var n = new Node(data,null,null);
            if(this.root == null) {
                this.root = n;
            } else {
                var current = this.root;
                var parent;
                while(current) {
                    parent = current;
                    if(data <  current.data) {
                        current = current.left;
                        if(current == null) {
                            parent.left = n;
                            break;
                        }
                    } else {
                        current = current.right;
                        if(current == null) {
                            parent.right = n;
                            break;
                        }
                    }
                }
            }
        }
        function inOrder(node) {
            if(!(node == null)) {
                inOrder(node.left);         //先将小的输出
                console.log(node.show());   //输出自己
                inOrder(node.right);        //然后输出大的
            }
        }

        function preOrder(node) {
            // 先序遍历 
            if(!(node == null)) {
                console.log(node.show());               //先输出当前节点的值
                preOrder(node.left);                    //再输出左侧的值
                preOrder(node.right);                   //再输出右侧的值
            }
        }
        function postOrder(node) {
            //后续访问数据
            if(!(node == null)) {
                postOrder(node.left);                   //先输出左侧
                postOrder(node.right);                  //再输出右侧
                console.log("后序遍历"+node.show());        //然后输出当前节点
            }
        }

        function getMin(){
            //获取最小值
            var current = this.root;
            while(!(current.left == null)) {
                current = current.left;
            }
            return current.data;
        }
        // 二叉树上查找最大值
        function getMax() {
            var current = this.root;
            while(!(current.right == null)) {
                current = current.right;
            }
            return current.data;
        }

        function find(data) {
            //查找给定值
            var current = this.root;
            while(current != null) {
                if(current.data == data) {
                    return current;
                }else if(data < current.data) {
                    current = current.left;
                }else {
                    current = current.right;
                }
            }
            return null;
        }

        function remove(data) {
            //删除节点
            root = removeNode(this.root,data);
            console.info(root);
        }

        function removeNode(node,data) {
            if(node == null) {
                return null;
            }
            if(data == node.data) {
                //没有子节点的节点
                if(node.left == null && node.right == null) {
                    return null;
                }
                // 没有左子节点的节点
                if(node.left == null) {
                    return node.right;
                }
                // 没有右子节点的节点
                if(node.right == null) {
                    return node.left;
                }
                // 有2个子节点的节点
                var tempNode = getSmallest(node.right);
                node.data = tempNode.data;
                node.right = removeNode(node.right,tempNode.data);
                console.info(node.right,22222);
                return node;
            } else if(data < node.data) {
                node.left = removeNode(node.left,data);
                return node;
            }else {
                node.right = removeNode(node.right,data);
                return node;
            }
        }

        function getSmallest(node) {
            if (node.left == null) {
                return node;
            } else {
                return getSmallest(node.left);
            }
        }

        var nums = new BST();
        nums.insert(23);
        nums.insert(45);
        nums.insert(16);
        nums.insert(37);
        nums.insert(3);
        nums.insert(99);
        nums.insert(22);
        //nums.inOrder(nums.root);

        //nums.preOrder(nums.root);         //先序访问
        //nums.postOrder(nums.root);        //后续访问
        //var min = nums.getMin();
        //console.info("最小值:" + min);           //最小值:3
        //var max = nums.getMax();
        //console.info("最大值:" + max);           //最大值:99
        //var data = nums.find(23);
        //console.info(data);
        nums.remove(23);
        console.info(nums,333333);
    </script>
</html>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值