力扣 114. 二叉树展开为链表

题目说明

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

展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
展开后的单链表应该与二叉树 先序遍历 顺序相同。

提示:

  • 树中结点数在范围 [0, 2000]
  • -100 <= Node.val <= 100

示例

示例 1:

img

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

示例 2:

1
2
输入:root = []
输出:[]

示例 3:

1
2
输入:root = [0]
输出:[0]

笔者理解

此题是一道二叉树算法问题,在力扣题库中被定义为中等题。

解法

当笔者阅读完此题后,发现本题可以采用回溯的思想,前序遍历的顺序是根左右,所以我们选择按照最右、最左、根的顺序倒序回溯操作,让我们来看看具体如何实现的吧。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
* 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 {
/**
* 尾指针
*/
TreeNode last = null;

public void flatten(TreeNode root) {
if (root == null) {
return ;
}
// 预先操作最右节点
flatten(root.right);
flatten(root.left);

// 按照右 左 根的顺序倒序操作,以尾指针标记最后操作节点
root.right = last;
root.left = null;
last = root;
}
}

时间和空间效率还行,可见此解法还比较适合此题。

image-20211116152058590

总结

本题是今天的一题,难度是为中等,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。