Javascript -- 二叉树实现

二叉树

树:与阵列,链接列表,堆栈和队列(线性数据结构)不同,树是分层数据结构。

树词汇表:最顶层的节点称为树的根。直接位于元素下的元素称为子元素。直接在某个东西上方的元素称为其父元素。

为何选择树

1.使用树的一个原因可能是因为您希望存储自然形成层次结构的信息。例如,计算机上的文件系统:

file system
-----------
     /    <-- root
  /      \
...       home
      /          \
   ugrad        course
    /       /      |     \
  ...      cs101  cs112  cs113  

2.树(具有一些排序,例如BST)提供适度的访问/搜索(比链接列表更快并且比数组慢)。
3.树提供适度的插入/删除(比阵列更快,比无序链接列表慢)。
4.与链接列表类似,与阵列不同,当节点使用指针链接时,树没有节点数量的上限。

树的主要应用包括:
1。处理分层数据。
2.使信息易于搜索(参见树遍历)。
3.处理已排序的数据列表。
4.作为合成视觉效果的数字图像的工作流程。
5.路由器算法
6.多阶段决策的形式(见商业象棋)。

二叉树: 一个树,其元素最多包含2个子元素,称为二叉树。由于二叉树中的每个元素只能有2个子元素,因此我们通常将它们命名为左右子元素。

demo

话不多说,代码奉上

function myBinaryTree(){
        var Node = function(key){
            //键值
            this.key = key;
            //左右孩子
            this.leftNode = null;
            this.rightNode = null;
        }
        var rootNode = null; // 根节点

        var insertNode = function(node,newNode){
            //新节点小于老节点的值,插在左边
            if(newNode.key < node.key){
                //如果是空,直接插入
                if(node.leftNode === null){
                    node.leftNode = newNode;
                }else{
                    //不为空,向其左孩子的新节点插入
                    insertNode(node.leftNode,newNode);
                }
            }else{
                //与左孩子插入逻辑相同
                if(node.rightNode === null){
                    node.rightNode = newNode;
                }else{
                    insertNode(node.rightNode,newNode);
                }
            }
        }


        //插入节点
        this.insert = function(key){
            var newNode = new Node(key);   //创建节点对象

            if(rootNode === null){
                rootNode = newNode; //创建根节点
            }else{
                insertNode(root,newNode);   //插入节点
            }
        };

        var nodes = [8,3,10,1,6,14,4,7,13];
        var binaryTree = new myBinaryTree();

        nodes.forEach(function(key){
            binaryTree.insert(key);
        });

    }

之前有写过树的遍历:Mr.J--树的遍历方式详解

二叉树之所以重要,是因为它支持或拥有的操作,包括增删改查重要的操作,复杂度比完成同样功能的其他结构更低。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值