114. Flatten Binary Tree to Linked List
题目
Given the root of a binary tree, flatten the tree into a "linked list":
- The "linked list" should use the same
TreeNodeclass where therightchild pointer points to the next node in the list and theleftchild pointer is alwaysnull. - The "linked list" should be in the same order as a pre-order traversal of the binary tree.
Example 1:

Input: root = [1,2,5,3,4,null,6] Output: [1,null,2,null,3,null,4,null,5,null,6]
Example 2:
Input: root = [] Output: []
Example 3:
Input: root = [0] Output: [0]
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)? Related Topics
思路
使用栈存储 right 节点,先入后出原理,依次添加到处理完 left 的子节点上
python
class Solution:
def flatten(self, root: Optional[TreeNode]) -> None:
"""
Do not return anything, modify root in-place instead.
"""
if not root:
return
node = root
stack = []
while node:
if node.right:
stack.append(node.right)
if node.left:
node.right = node.left
node.left = None
elif stack:
node.right = stack.pop()
node = node.rightpy
# leetcode submit region begin(Prohibit modification and deletion)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def flatten(self, root: Optional[TreeNode]) -> None:
"""
Do not return anything, modify root in-place instead.
"""
if not root:
return
node = root
while node:
if node.left:
predecessor = node.left
while predecessor.right:
predecessor = predecessor.right
predecessor.right = node.right
node.right = node.left
node.left = None
node = node.right
# leetcode submit region end(Prohibit modification and deletion)复杂度分析
- 时间复杂度 O(N)
- 空间复杂度 O(N)
空间复杂度为为1的解法
解法1的移动方式:
自下到上的节点移动,故需要存储未移动的遍历节点
解法2 的移动方式
自上到下的节点移动,right 节点需要存储在 left 树的 rightmost 节点的 right 节点
- 寻找 left 树的 rightmost 节点
- 移动 right -> rightmost.right, 则 left -> right 节点
- loop node.right 重复以上过程
py
# leetcode submit region begin(Prohibit modification and deletion)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def flatten(self, root: Optional[TreeNode]) -> None:
"""
Do not return anything, modify root in-place instead.
"""
if not root:
return
node = root
while node:
if node.left:
predecessor = node.left
while predecessor.right:
predecessor = predecessor.right
predecessor.right = node.right
node.right = node.left
node.left = None
node = node.right
# leetcode submit region end(Prohibit modification and deletion)复杂度分析
- 时间复杂度 O(N)
- 空间复杂度 O(1)