vlambda博客
学习文章列表

每日一题-二叉树展开为链表

2022.4.20

114. 二叉树展开为链表

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

  • 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null

  • 展开后的单链表应该与二叉树 先序遍历 顺序相同。

示例 1:

输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]

题解:

这种父子节点关系转化的题目,一般的思路,是递归,递归的话需要将问题转化为一般性的子问题:对于某个节点root,需要对其左子树拉平,右子树拉平,再将右子树接到左子树的右下方,接好后的整个左子树接到root右下方

class Solution {
   // 定义:将以 root 为根的树拉平为链表
void flatten(TreeNode root) {
   // base case
   if (root == null) return;
   
   flatten(root.left);
   flatten(root.right);

   /**** 后序遍历位置 ****/
   // 1、左右子树已经被拉平成一条链表
   TreeNode left = root.left;
   TreeNode right = root.right;
   
   // 2、将左子树作为右子树
   root.left = null;
   root.right = left;

   // 3、将原先的右子树接到当前右子树的末端
   TreeNode p = root;
   while (p.right != null) {
       p = p.right;
  }
   p.right = right;
}

}