【JS数据结构与算法】根据二叉树带有#号的层次遍历结果[8,8,7,9,2,'#','#','#','#',4,7]创建二叉树

前言

为了实现二叉树的有关操作,我们必须要创建出二叉树结构,而不是单纯的使用数组或者是题目给出的用例;

比如剑指offer中的: 二叉树的子结构
题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
用例:

{
    
    8,8,7,9,2,#,#,#,#,4,7},{
    
    8,9,2}

对应输出应该为:

true

根据用例给出了二叉树的各个元素,但是具体的结构却没有,解题的之前,我们需要了解树的结构是怎么样
{8,8,7,9,2,#,#,#,#,4,7} 其实是二叉树层次遍历后的结果#表示的是空节点。最终的结构就会是以下这样的:

在这里插入图片描述
对于数组 [8,8,7,9,2,#,#,#,#,4,7] ,我们为二叉树的结构标上数组的对应下标
在这里插入图片描述
不难看出如果将 #加上,那就是一个完全二叉树,根据左右节点的数组下标值,我们可以得出一个规律

  • 如果当前节点对应的数组下标值为 index
  • 当前节点的左节点 ----->> index * 2 + 1
  • 当前节点的右节点 ----->> index * 2 + 2

构建思路:

  • 传入数组的第一个元素,如果不为 #(空),将该元素作为根节点
  • 根节点的左子节点递归地传入 index * 2 + 1
  • 根节点的左子节点递归地传入 index * 2 + 2
  • 如果传入的 index 值大于等于数组长度,则返回根节点,即创建出来的二叉树
 function TreeNode(val) {
    
    
     this.val = val;
     this.left = null;
     this.right = null;
 }

 function create(index, data) {
    
    
     var p = null;
     if (index >= data.length)  return p;
     if (data[index] != '#') {
    
    
         p = new TreeNode(data[index]);
         p.left = create(index * 2 + 1, data);
         p.right = create(index * 2 + 2, data);
     }
     return p;
 }

测试代码

 var arr = [8, 8, 7, 9, 2, '#', '#', '#', '#', 4, 7];
 var tree = create(0, arr);
 console.log(tree)

最终的结构:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42339197/article/details/104252079