美文网首页
利用JavaScript生成一棵二叉树

利用JavaScript生成一棵二叉树

作者: gaoshu883 | 来源:发表于2018-07-15 22:33 被阅读0次

在现实世界中,计算机需要处理的数据元素之间存在各种各样的关系,比如一对一、一对多、多对多,树是表示一对多关系的数据结构。在任意一棵非空树中,只存在唯一一个根节点。树中的节点可以分支形成它的子树,在二叉树中,每个节点最多有两棵子树,分别称为左子树和右子树。没有子树的节点被称为叶子节点(或终端节点)。

对于一棵已经存在的二叉树,遍历它的方式有很多。如果我们限制从左到右的习惯方式,那么二叉树的遍历方式主要有:前序遍历、中序遍历、后序遍历和层序遍历。我们之所以需要遍历二叉树,是因为计算机只会处理线性序列,因此通过遍历,就把有层次的二叉树转化成了一个线性序列。

现在,在内存中生成一棵二叉树是首要问题。我们可以利用前序遍历序列生成一棵二叉树。

二叉树

如上图所示,我们需要构建的这棵二叉树的所有叶子节点均表示为特殊符号“✿”,而且,除叶子节点外,每个节点均存在左右孩子。该二叉树的前序遍历序列为“0123✿✿✿4✿✿56✿✿✿”。

利用JavaScript生成这棵二叉树的完整算法如下:

const FLOWER = '✿';
const arr = '0123✿✿✿4✿✿56✿✿✿'.split('');
let i = 0; // 二叉树节点字符数组遍历索引
let l = 0; // 树的深度索引
let printArr = []; // 二维数组,缓存每层的节点字符数据
// 节点
function Node() {
  this.data = FLOWER;
  this.leftChild = null;
  this.rightChild = null;
}
// 生成二叉树
// @params {Node} node 节点
// @params {number} layer 当前树层度
// @params {Node} parent 父节点
function createBiTree(node, layer, parent) {
  if (!printArr[layer]) {
    printArr[layer] = [];
  }
  if (arr[i] === FLOWER) {
    printArr[layer].push(`${node.data}(${parent ? parent.data : 'null'})`);
    return;
  } else {
    node.data = arr[i];
    printArr[layer].push(`${node.data}(${parent ? parent.data : 'null'})`);
    node.leftChild = new Node();
    i++;
    createBiTree(node.leftChild, ++layer, node);
    node.rightChild = new Node();
    i++;
    createBiTree(node.rightChild, layer, node);
  }
}
var bt = new Node();
createBiTree(bt, l);

// console.log(bt);
console.log(printArr);

上述算法中,layerparent的引入主要为缓存树每层的节点字符数据,二维数组printArr每行代表树的一层,控制台有以下输出:(括号中为当前节点的父节点)

控制台输出



本文原发于公众号【观阅之余】,这是个有想法的地方~欢迎大家扫码关注。

观阅之余

相关文章

  • 利用JavaScript生成一棵二叉树

    在现实世界中,计算机需要处理的数据元素之间存在各种各样的关系,比如一对一、一对多、多对多,树是表示一对多关系的数据...

  • 二叉树的遍历

    构造 二叉树的构造。先要有一棵树,才能遍历一棵树。 首先构造一颗简单的完全二叉树 删去一些节点: 生成了一棵树,开...

  • 数据结构题目47:二叉树的复制

    题目:复制一棵二叉树。 解题思路:可以利用二叉树的前序遍历算法达到目的。这里,假设经过复制以后产生的二叉树的根结点...

  • 【剑指Offer】039——平衡二叉树(树)

    题目 输入一棵二叉树,判断该二叉树是否是平衡二叉树 思路 平衡二叉树:某节点的左右子树深度差绝对值不超过1。利用递...

  • 利用javascript生成下载链接

    项目中有个需求,生成一个含有大量链接的文本文件提供给用户下载。链接格式如下: http://wiyi.org/?p...

  • 二叉树的建立 建立二叉树,利用了递归的原理,也就是在打印二叉树的前中后序遍历算法中打印结点的地方,改成了生成结点,...

  • 二叉树的递归和非递归前序遍历、中序遍历、后序遍历

    一、生成二叉树 新建一个类: 生成二叉树方法: 生成二叉树: 二、前序遍历 前序遍历:访问顺序是【根节点】-【左孩...

  • 面试题7:重建二叉树

    题意:输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。 算法:递归 思路:1)利用前序遍历找根节点,即前序...

  • 二叉树广度优先遍历、深度优先遍历、深度计算

    一、生成二叉树 新建一个类: 生成二叉树方法: 生成二叉树: 二、广度优先遍历 广度优先遍历,也可以称为层次优先遍...

  • 34.对称的二叉树

    题目:判断一棵二叉树是不是对称二叉树 思路: 利用递归,先写一个子函数,判断一下两棵树是不是互为镜像,设计思路是当...

网友评论

      本文标题:利用JavaScript生成一棵二叉树

      本文链接:https://www.haomeiwen.com/subject/bojmpftx.html