JS算法-二叉树展开转为链表

简介: JS算法-二叉树展开转为链表

题目


给你二叉树的根结点 root ,请你将它展开为一个单链表:


  • 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
  • 展开后的单链表应该与二叉树 先序遍历 顺序相同。
输入: root = [1,2,5,3,4,null,6]
输出: [1,null,2,null,3,null,4,null,5,null,6]

根据以上题目要求,我想到了以下解法


解题思路


第一种


对于这种题目,我脑海中第一个浮现出来的就是递归这种方式,所以我们这里先采用递归的方式来对上述算法题求解,通过递归从最小的节点开始进行慢慢推平,推平到全局,由点成面,首先我们对root数组的最左侧节点的最底部开始进行向上遍历,然后将当前遍历中节点的左节点直接替换掉右节点,然后在从最左侧节点向下查找,如果找到没有右节点的数据,则将上一个右节点直接放到当前节点的后面,这样一个节点就完成了,然后进行遍历父节点,我们需要将当前的左节点全部拼接在父节点的右节点上并依次向右节点进行遍历,如果发现右侧没有节点那么就将之前的右节点放在当前节点的右边,这样就可以得到一个新的数组,然后在依次进行递归让数据向上传递,就可以获得一个完整的单链表数

var flatten = function(root) {
    if (!root) return;
    flatten(root.left);
    flatten(root.right);
    const right = root.right;
    root.right = root.left;
    root.left = null;
    let p = root;
    while (p.right) {
        p = p.right;
    }
    p.right = right;
};


第二种


我们首先定义了两个变量,list用于存放遍历的节点,stack用于存放遍历的路径。接着定义了一个变量node,默认值root,用于存放当前遍历的节点。然后在while循环中,先判断node是否存在,若存在,则将它加入list和stack 数组中。然后将node的左子节点赋值给node,继续遍历左子节点。若node 不存在,即当前的子树遍历完了,则将 stack 中最后一个元素弹出,并将其右子节点赋值给 node,继续遍历右子节点。若node 不存在了且stack数组为空时,说明遍历完成,此时list数组中存放的就是展开后的节点。最后将每个节点的左子节点设为null,将右子节点设为前一个节点,即可将二叉树展开成链表

   var flatten = function (root) {
      const list = [];
      const stack = [];
      let node = root;
      while (node || stack.length) {
        while (node) {
          list.push(node);
          stack.push(node);
          node = node.left;
        }
        node = stack.pop();
        node = node.right;
      }
      const size = list.length;
      for (let i = 1; i < size; i++) {
        const prev = list[i - 1], curr = list[i];
        prev.left = null;
        prev.right = curr;
      }
      return list;
    };
相关文章
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
540 10
 算法系列之数据结构-二叉树
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
480 64
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
674 30
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
962 25
|
存储 监控 算法
员工电脑监控系统中的 C# 链表算法剖析-如何监控员工的电脑
当代企业管理体系中,员工电脑监控已成为一个具有重要研究价值与实践意义的关键议题。随着数字化办公模式的广泛普及,企业亟需确保员工对公司资源的合理利用,维护网络安全环境,并提升整体工作效率。有效的电脑监控手段对于企业实现这些目标具有不可忽视的作用,而这一过程离不开精妙的数据结构与算法作为技术支撑。本文旨在深入探究链表(Linked List)这一经典数据结构在员工电脑监控场景中的具体应用,并通过 C# 编程语言给出详尽的代码实现与解析。
312 5
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
358 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
存储 算法 物联网
解析局域网内控制电脑机制:基于 Go 语言链表算法的隐秘通信技术探究
数字化办公与物联网蓬勃发展的时代背景下,局域网内计算机控制已成为提升工作效率、达成设备协同管理的重要途径。无论是企业远程办公时的设备统一调度,还是智能家居系统中多设备间的联动控制,高效的数据传输与管理机制均构成实现局域网内计算机控制功能的核心要素。本文将深入探究 Go 语言中的链表数据结构,剖析其在局域网内计算机控制过程中,如何达成数据的有序存储与高效传输,并通过完整的 Go 语言代码示例展示其应用流程。
310 0
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
776 3
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
330 5
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充