javascript线索化二叉树

作者: _shen | 来源:发表于2018-03-22 18:35 被阅读20次
定义二叉树创建方法
var Node = function (data) {
  this.left = null;
  this.right = null;
  this.LTag = 0;
  this.RTag = 0;
  this.data = data;
}

/**
 * createTree 
 * 采取递归方式创建二叉树
 * arr:二叉树结点数组,其中数字0表示为空节点
 */
function createTree (arr) {
  let data = arr.shift(),
      p = null;

  if (data != 0) {
    p = new Node(data);
    p.data = data;
    p.left = createTree(arr);
    p.right = createTree(arr);
    }

  return p;
}
对二叉树进行中序线索化
/**
 * middleTraverseThreading
 * 
 * 通过递归的方式对二叉树进行中序线索化
 *
 * node:当前结点
 * prev:父结点/前驱结点
 * next:后驱结点
 */
function middleTraverseThreading (node, prev, next) {
  if (node === null) return;

  // 如果是非叶子节点,递归
  if (node.LTag === 0) {
    // 递归左结点
    middleTraverseThreading(node.left, prev, node);
  }  

  // 如果左子树为空,让左子树指向前驱
  if (node.left === null) {
    node.LTag = 1;
    node.left = prev;
  }

  // 如果右子树为空,让右子树指向后驱
  if (node.right === null) {
    node.RTag = 1;
    node.right = next;
  }

  // 如果是非叶子节点,递归
  if (node.RTag === 0) {
    // 递归右节点
    middleTraverseThreading(node.right, node, next);
  }  

}
遍历线索二叉树
/**
 * 遍历线索二叉树
 *
 */
function traverseTree (root) {
  if (root === null) return;
  let p = root;

  // 找到最左边的叶子结点
  while(p.LTag === 0) {
    p = p.left;
  }

  // 从最左边的叶子结点开始遍历
  while (p !== root) {
    console.log(p.data);
    p = p.right;
  }

  // 打印根节点root
  console.log(p.data);

  p = p.right;
  // 从最左边的叶子结点开始遍历
  while (p !== root) {
    console.log(p.data);
    p = p.right;
  }

}
测试
let arr = [1,2,4,0,0,5,0,0,3,6,0,0,7,0,0],
root = createTree(arr);

// 对二叉树进行中序线索化
middleTraverseThreading(root, root, root);

// 遍历线索化二叉树
traverseTree(root);

相关文章

  • 数据结构与算法分析四 树(续)

    ** 顺序存储 ** 线索化二叉树 线索化代码实现

  • 数据结构线索二叉树

    线索二叉树构成 线索化的节点 实现

  • javascript线索化二叉树

    定义二叉树创建方法 对二叉树进行中序线索化 遍历线索二叉树 测试

  • 69_二叉树的线索化实现

    关键词:二叉树的额线索化 0. 什么是线索化二叉树? 将二叉树转换为双向链表的过程(非线性==》线性) 能够反映某...

  • 数据结构题目52:二叉树的线索化

    题目:二叉树的线索化对二叉树的线索化,就是把二叉树的二叉链表存储结构中结点的所有空指针域改造成指向某结点在某种遍历...

  • 线索二叉树

    之前我们说过二叉树的顺序存储和链式存储,那么今天我们来说一下线索化二叉树是如何实现的。 线索化二叉树其实就是在二叉...

  • 线索二叉树操作

    树节点 创建中序线索二叉树 遍历中序线索二叉树 创建前序线索二叉树 遍历前序线索二叉树 参考:https://bl...

  • 详细图解二叉树线索化及其实现

    为了更好的阅读体验你可以查看我的github原文 线索二叉树节点定义 二叉树线索化的过程中,会把树中的空指针利用起...

  • 二叉树—线索二叉树

    1、线索二叉树的引入 在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序、中序、后序或...

  • 线索二叉树

    线索二叉树产生背景 解决空间浪费 为了寻找某个结点的前驱和后继的时候更加简单快捷,利用有限的空间进行线索化的处理 ...

网友评论

    本文标题:javascript线索化二叉树

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