最近刷题刷到了二叉树,虽然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)
输出结果为: