当前位置: 首页 > news >正文

【Leetcode 热题 100】114. 二叉树展开为链表

问题背景

给你二叉树的根结点 r o o t root root,请你将它展开为一个单链表:
展开后的单链表应该同样使用 T r e e N o d e TreeNode TreeNode,其中 r i g h t right right 子指针指向链表中下一个结点,而左子指针始终为 n u l l null null
展开后的单链表应该与二叉树 先序遍历 顺序相同。

数据约束

  • 树中结点数在范围 [ 0 , 2000 ] [0, 2000] [0,2000]
  • − 100 ≤ N o d e . v a l ≤ 100 -100 \le Node.val \le 100 100Node.val100

解题过程

可以从尾到头构建链表,那么要求递归的顺序与先序遍历恰好相反,先递归遍历右子树,再递归遍历左子树,最后处理当前节点。当前节点应该用头插法加入到链表中,需要一个变量来保存先前处理完的节点。
从分治的观点来看,每棵子树可以把根节点作为划分标准,拆成左右子树两个不同的部分。这时构造链表只需要将左右子树上已经形成的链表串起来即可。

具体实现

直接递归

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {private TreeNode pre;public void flatten(TreeNode root) {if(root == null) {return;}flatten(root.right); // 递归处理左子树flatten(root.left); // 递归处理右子树root.left = null; // 根节点的左指针域置空root.right = pre; // 根节点的右指针域指向先前保存的节点pre = root; // 重新记录}
}

分治合并

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public void flatten(TreeNode root) {dfs(root);}// 递归方法返回每棵子树的尾节点private TreeNode dfs(TreeNode root) {if(root == null) {return null;}TreeNode leftTail = dfs(root.left); // 递归获取左子树的尾节点TreeNode rightTail = dfs(root.right); // 递归获取右子树的尾节点if(leftTail != null) {leftTail.right = root.right; // 左子树的尾节点右指针域指向右子树root.right = root.left; // 根节点的右指针域指向左子树root.left = null; // 根节点的左子树置空}// 维持方法定义,按照右左根的优先顺序返回子树的尾节点return rightTail != null ? rightTail : leftTail != null ? leftTail : root;}
}

http://www.mrgr.cn/news/80892.html

相关文章:

  • 盛元广通畜牧与水产品检验技术研究所LIMS系统
  • 初学stm32 --- 系统时钟配置
  • OpenCV学习——图像融合
  • Android 获取屏幕物理尺寸
  • Azure Function流式返回
  • 关于分页的样式问题
  • 【软考高级】系统架构设计师复习笔记-精华版
  • 【Leetcode 热题 100 - 扩展】303. 区域和检索 - 数组不可变
  • 【数据可视化案列】白葡萄酒质量数据的EDA可视化分析
  • ECharts关系图-关系图11,附视频讲解与代码下载
  • FPGA 16 ,Verilog中的位宽:深入理解与应用
  • OCR实践—PaddleOCR
  • 【0373】Postgres内核 MultiXact shared memory 初始化 ( 2 )
  • Docker_常用命令详解
  • STM32单片机芯片与内部33 ADC 单通道连续DMA
  • 被裁20240927 --- 嵌入式硬件开发 前篇
  • Mac iOS、Android、Flutter、React Native开发环境配置
  • 【Linux】文件IO--read/write/缓冲区(详)
  • 【Rust自学】4.3. 所有权与函数
  • [Linux] 信号保存与处理
  • 单片机:实现延时函数(附带源码)
  • 《剑网三》遇到找不到d3dx9_42.dll的问题要怎么解决?缺失d3dx9_42.dll是什么原因?
  • 字节跳动C++面试题及参考答案(下)
  • git使用和gitlab部署
  • [LeetCode-Python版] 定长滑动窗口3——1461. 检查一个字符串是否包含所有长度为 K 的二进制子串
  • 二十一、Ingress 进阶实践