mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-05 08:27:30 +08:00
126 lines
2.4 KiB
Markdown
Executable File
126 lines
2.4 KiB
Markdown
Executable File
# [114. Flatten Binary Tree to Linked List](https://leetcode.com/problems/flatten-binary-tree-to-linked-list/)
|
|
|
|
|
|
## 题目
|
|
|
|
Given a binary tree, flatten it to a linked list in-place.
|
|
|
|
For example, given the following tree:
|
|
|
|
1
|
|
/ \
|
|
2 5
|
|
/ \ \
|
|
3 4 6
|
|
|
|
The flattened tree should look like:
|
|
|
|
1
|
|
\
|
|
2
|
|
\
|
|
3
|
|
\
|
|
4
|
|
\
|
|
5
|
|
\
|
|
6
|
|
|
|
## 题目大意
|
|
|
|
给定一个二叉树,原地将它展开为链表。
|
|
|
|
## 解题思路
|
|
|
|
- 要求把二叉树“打平”,按照先根遍历的顺序,把树的结点都放在右结点中。
|
|
- 按照递归和非递归思路实现即可。
|
|
- 递归的思路可以这么想:倒序遍历一颗树,即是先遍历右孩子,然后遍历左孩子,最后再遍历根节点。
|
|
|
|
1
|
|
/ \
|
|
2 5
|
|
/ \ \
|
|
3 4 6
|
|
-----------
|
|
pre = 5
|
|
cur = 4
|
|
|
|
1
|
|
/
|
|
2
|
|
/ \
|
|
3 4
|
|
\
|
|
5
|
|
\
|
|
6
|
|
-----------
|
|
pre = 4
|
|
cur = 3
|
|
|
|
1
|
|
/
|
|
2
|
|
/
|
|
3
|
|
\
|
|
4
|
|
\
|
|
5
|
|
\
|
|
6
|
|
-----------
|
|
cur = 2
|
|
pre = 3
|
|
|
|
1
|
|
/
|
|
2
|
|
\
|
|
3
|
|
\
|
|
4
|
|
\
|
|
5
|
|
\
|
|
6
|
|
-----------
|
|
cur = 1
|
|
pre = 2
|
|
|
|
1
|
|
\
|
|
2
|
|
\
|
|
3
|
|
\
|
|
4
|
|
\
|
|
5
|
|
\
|
|
6
|
|
|
|
- 可以先仿造先根遍历的代码,写出这个倒序遍历的逻辑:
|
|
|
|
public void flatten(TreeNode root) {
|
|
if (root == null)
|
|
return;
|
|
flatten(root.right);
|
|
flatten(root.left);
|
|
}
|
|
|
|
- 实现了倒序遍历的逻辑以后,再进行结点之间的拼接:
|
|
|
|
private TreeNode prev = null;
|
|
|
|
public void flatten(TreeNode root) {
|
|
if (root == null)
|
|
return;
|
|
flatten(root.right);
|
|
flatten(root.left);
|
|
root.right = prev;
|
|
root.left = null;
|
|
prev = root;
|
|
}
|