114. Flatten Binary Tree to Linked List(M)
https://leetcode.com/problems/flatten-binary-tree-to-linked-list/
Last updated
https://leetcode.com/problems/flatten-binary-tree-to-linked-list/
Last updated
Given the root
of a binary tree, flatten the tree into a "linked list":
The "linked list" should use the same TreeNode
class where the right
child pointer points to the next node in the list and the left
child pointer is always null
.
The "linked list" should be in the same order as a pre-order traversal of the binary tree.
Example 1:
Example 2:
Example 3:
Constraints:
The number of nodes in the tree is in the range [0, 2000]
.
-100 <= Node.val <= 100
Follow up: Can you flatten the tree in-place (with O(1)
extra space)?
我们尝试给出这个函数的定义:
给 flatten
函数输入一个节点 root
,那么以 root
为根的二叉树就会被拉平为一条链表。
我们再梳理一下,如何按题目要求把一棵树拉平成一条链表?很简单,以下流程:
1、将 root
的左子树和右子树拉平。
2、将 root
的右子树接到左子树下方,然后将整个左子树作为右子树。
上面三步看起来最难的应该是第一步对吧,如何把 root
的左右子树拉平?其实很简单,按照 flatten
函数的定义,对 root
的左右子树递归调用 flatten
函数即可:
这段就是让原右子树接到原左子树的末尾
具体到这张图的话, 也就是让5
接到4
后面
如果不用while
循环, 则5
会直接接到2
的后面, 这样点话3
和4
就丢失
你看,这就是递归的魅力,你说 flatten
函数是怎么把左右子树拉平的?说不清楚,但是只要知道 flatten
的定义如此,相信这个定义,让 root
做它该做的事情,然后 flatten
函数就会按照定义工作。另外注意递归框架是后序遍历,因为我们要先拉平左右子树才能进行后续操作。
https://www.jiuzhang.com/solution/flatten-binary-tree-to-linked-list/
https://www.jiuzhang.com/solution/flatten-binary-tree-to-linked-list/