js二叉树的实现练手

1 篇文章 0 订阅
1 篇文章 0 订阅

js二叉树的实现练手

二叉树的好处就不用说了,本实例主要实现了排序、查找、删除、新增,有兴趣的同学可以继续完善。

<!DOCTYPE html>
<html>
<head>
    <title>js二叉树</title>
</head>
<body>
    <script type="text/javascript">
        /*
            ===yancheng@infogo.com.cn======

            主要实现:二叉树排序、查找、删除、新增
            原始数据:[8,4,1,6,5,7,15,14,13,16]
            二叉树结构:左小右大方式
                            8                   ----第一层
                4                       15      ----第二层
            1       6               14      16  ----第三层
                5       7       13              ----第四层

            二叉树满足条件:
                (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
                (2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
                (3)左、右子树也分别为二叉排序树;
                (4)没有键值相等的节点。

        */

        //二进制树
        function binaryTree(valarr){
            var rootNode = null;
            //创建节点对象方法
            function nodeTree(val){
                this.val = val;
                this.left = null;
                this.right = null;
            }

            //设置节点
            var setNode = function(node,val){
                var newNode = new nodeTree(val);
                if(rootNode===null){
                    rootNode = newNode;
                }else if(val<node.val){
                    if(node.left!==null){
                        setNode(node.left, val);
                    }else{
                        node.left = newNode;
                    }
                }else if(val>node.val){
                    if(node.right!==null){
                        setNode(node.right, val);
                    }else{
                        node.right = newNode;
                    }
                }
            }
            //根据值返回节点
            var getNode = function(val){
                var searchval = parseFloat(val);
                if(rootNode!==null && searchval){   
                    return (function fn(node, searchval){

                            if(searchval == node.val){
                                return node;
                            }else if(searchval<node.val && node.left!==null){
                                return fn(node.left, searchval);
                            }else if(searchval>node.val && node.right!==null){
                                return fn(node.right, searchval);
                            }else{
                                return false;
                            }

                    })(rootNode, searchval)
                }
                return false;
            }
            //获取最小节点
            var getMinNode = function(node){
                if(node!==null){
                    return (function fn(node){
                        if(node.left!==null){
                            return fn(node.left);                           
                        }
                        return node;
                    })(node)
                }
                return null;
            }

            //前序遍历
            this.preorderTraversal = function(){
                if(rootNode!==null){
                    var orderBefer = [];
                    return (function fn(node){
                        if(node!==null){
                            orderBefer.push(node.val);
                            fn(node.left);
                            fn(node.right);
                            return orderBefer;
                        }
                    })(rootNode)
                }
                return null;
            }

            //中序遍历
            this.inorderTraversal = function(){
                if(rootNode!==null){
                    var orderBefer = [];
                    return (function fn(node){
                        if(node!==null){
                            fn(node.left);
                            orderBefer.push(node.val);
                            fn(node.right);
                            return orderBefer;
                        }
                    })(rootNode)
                }
                return null;
            }

            //后续遍历
            this.postorderTraversal  = function(){
                if(rootNode!==null){
                    var orderBefer = [];
                    return (function fn(node){
                        if(node!==null){
                            fn(node.right);
                            orderBefer.push(node.val);
                            fn(node.left);
                            return orderBefer;
                        }
                    })(rootNode)
                }
                return null;
            }
            //获取最大值
            this.getMaxVal = function(){
                if(rootNode!==null){
                    return (function fn(node){
                        if(node.right!==null){
                            return fn(node.right);                          
                        }
                        return node.val;
                    })(rootNode)
                }
                return null;
            }
            //获取最小值
            this.getMinVal = function(){
                if(rootNode!==null){
                    var minNode = getMinNode(rootNode);
                    if(minNode!=null){
                        return minNode.val;
                    }
                }
                return null;
            }

            //查找某值是否存在
            this.searcheVal = function(val){
                var node = getNode(val);
                return typeof node == 'object' ? true :false;
            }

            //删除某个值
            this.removeVal = function(val){
                var searchval = parseFloat(val);
                if(rootNode!==null && searchval){
                    return (function fn(node, val){
                        if(node===null){return null;}

                        if(val < node.val){
                            node.left = fn(node.left, val);
                            return node;
                        }else if(val > node.val){
                            node.right = fn(node.right, val);
                            return node;
                        }else{//找到

                            if(node.left!=null && node.right==null){
                                node = node.left;
                                return node;
                            }else if(node.left==null && node.right!=null){
                                node = node.right
                                return node;
                            }else if(node.left!=null && node.right!=null){
                                //如果是中间节点且有左右子树,则查找右边最小节点,替换当前节点
                                var rightMinNode = getMinNode(node.right);
                                node.val = rightMinNode.val;
                                node.right = fn(node.right, rightMinNode.val);
                                return node;
                            }else{
                                node = null;
                                return node;
                            }
                        }

                    })(rootNode, val);
                }
                return false;

            }

            //添加值
            this.insertVal = function(val){
                setNode(rootNode,val);
            }

            //初始化数据
            return (function(_this){
                for (var i = 0; i < valarr.length; i++) {
                    setNode(rootNode, valarr[i]);
                }
                return _this;
            })(this);

        }

        //启动
        var BT = new binaryTree([8,4,1,6,5,7,15,14,13,16]);
        console.log(BT);
        var predata = BT.preorderTraversal();
            console.log('前序:', predata);
        var indata = BT.inorderTraversal();
            console.log('中序:', indata);
        var postdata = BT.postorderTraversal();
            console.log('后序:', postdata);
        var isSearch = BT.searcheVal(5);
            console.log('搜索5:', isSearch);
        var minVal = BT.getMinVal();
            console.log('最小值:', minVal);
        var maxVal = BT.getMaxVal();
            console.log('最大值:', maxVal);
        var removeVal = BT.removeVal(8);
            console.log('删除8后 前序:', BT.preorderTraversal());
        var insertdata = BT.insertVal(9);
            console.log('插入9 前序:', BT.preorderTraversal());

    </script>
</body>
</html>

简单测试过,欢迎吐槽。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值