用JS实现数据结构----排序二叉树

排序二叉树

图片描述

如上图为典型的排序二叉树,左孩子的值比节点的值小,右孩子的值比节点的值大,关于具体的树的定义及二叉树的定义可以百度或查阅相关资料。


排序二叉树的创建

  1. 创建原理
    排序二叉树的创建原理与排序二叉树的定义一致,即左孩子的值比当前节点的值小,右孩子的值比当前节点的值大。
  2. 代码实现
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>binary-tree</title>
    <link rel="stylesheet" href="">
</head>
<body>
    
    <script  type="text/javascript" charset="utf-8">
        
        //创建一个排序二叉树
        //
        function BinaryTree() {
            //节点类
            var Node = function(key) {
                this.key = key
                this.left = null
                this.right = null
            }

            // 根节点
            var root = null

            // 1
            var insertNode = function(node, newNode) {
                if(node !== null) {
                    if(newNode.key < node.key) {
                        insertNode(node.left, newNode)
                        if(node.left == null) {
                            node.left = newNode
                        }
                    }else{
                        insertNode(node.right, newNode)
                        if(node.right == null) {
                            node.right = newNode
                        }
                    }
                }

                return null
            }

            //插入节点
            this.insert = function(key) {
                var newNode = new Node(key)
                if(root === null) {
                    root = newNode
                }else {
                    insertNode(root, newNode)
                }
            }

            this.getTree = function() {
                return root
            }
        }


        var tree = new BinaryTree()
        var nodes = [8, 3, 10, 1, 6, 14, 4, 7, 11, 15]
        nodes.forEach(function(item) {
            tree.insert(item)
        })

        console.log(tree.getTree())




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

以上便是创建排序二叉树的实现方式:
重点在于插入节点的具体实现,即注释1的代码片段。
其中比较难理解的点在于递归是如何执行,
取当前的节点为{key: 1, left:null, right:null},则当前树如下图:

图片描述

对该树进行插入

           var insertNode = function(node, newNode) {
                if(node !== null) {
                    if(newNode.key < node.key) {
                        insertNode(node.left, newNode)
                        if(node.left == null) {
                            node.left = newNode
                        }
                    }else{
                        insertNode(node.right, newNode)
                        if(node.right == null) {
                            node.right = newNode
                        }
                    }
                }

                return null
            }

首先由根节点8出发,进入node的key为8的栈内1比根节点8要小,进入递归,即进入到了node的key为3的栈内,如下所示:

        3
   -----------------
        8
  --------------------------

当前的值比3小再进入3的左孩子null的栈内

    
        null
    ------------
        3
   -----------------
        8
  --------------------------
    

由于null的栈内,node为null,立即退出当前栈,返回至node的key为3的栈,发现左孩子为null,则将key为1的node变成key为3的node的左孩子,同时退出3的栈,返回至8的栈,8的栈左孩子不null,不做任何操作,知道当前方法执行完毕,跳出8的栈,返回至方法所在的执行环境的栈,节点插入完毕,再进行下一个节点的插入,操作则同上。以上的解释,如果配合上浏览器的断点调试,食用更佳,更好理解程序的整个执行过程。

当所有节点插入完毕之后,该排序二叉树也创建完毕。

二叉树创建完毕之后则可对二叉树进行相关的操作(遍历,查找,节点删除等)【待续】

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值