js如何创建二叉树/当输入是数组时,如何转换为二叉树结构?

        最近刷题刷到了二叉树,虽然leetcode上不需要我们自己去写二叉树结构,但是随想录的老师卡尔说过,面试中手写实现二叉树是常考的点,也是我们容易忽略的点,所以在他的视频里有讲解如何实现。但是问题是当我们在本地运行的时候不引入包的情况下,当输入是数组时,如何生成二叉树?《有点类似于链表》

 步骤:

1、将数组中的值 转化为 二叉树节点, 即定义二叉树节点类;

        二叉树节点具备3个属性:节点存储的值value,左子节点left,右子节点right        

  // 创建二叉树的节点类
        class treeNode{
            constructor(val, left, right){
                this.val = val===undefined ? 0 : val
                this.left = left === undefined ?  null : left
                this.right = right === undefined ? null : right
            }
        }

2、将 数组 转化为 二叉树结构                        

// 创建二叉树 数组 转化 为二叉树
        function createTree (arr){
            //将arr中所有的值转化为treeNode
            const nodes = arr.map(item => (item!==null ? new treeNode(item) : null) )
            // 创建根节点/父节点
            let root = nodes[0]
            // 定义父节点的索引值
            let parentIndex = 0
            // 遍历nodes中的值
            let i = 1
            // 如果i小于数组nodes的值就一直遍历,直到将nodes遍历完
            while (i < nodes.length){
                // node是nodes中的元素
                const node  =  nodes[i]
                // 定义父节点,初始父节点应该是nodes[0]
                let parent = nodes[parentIndex]
                // 如果父节点不为空的话就,将nodes中的元素 赋给父节点的left  和 right
                if(parent !== null){
                    parent.left = nodes[i]
                    i+1 >= node.length ? parent.right = null : parent.left = nodes[i+1]
                    // 更新父节点
                    parentIndex++
                    // 更新i的取值
                    i += 2
                }
                // 如果父节点是空的话就,直接更新父节点 的索引,因为null没有left 和 right
                else{
                    parentIndex++
                }
            }
            // 返回父节点即可
            return root
        }

3、函数测试:若我们想构造一个二叉树结构,如下图1所示,输入数组为arr =[1,2,3,4,5,null,6,null,7]

                                图1 二叉树结构 

函数函数调用:

 const arr = [1,2,3,4,5,null,6,null,7]
 let result = createTree(arr) //调用封装的函数createTree
 console.log(result)

输出结果为:

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值