Problem
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.
Algorithm
Recursion. dfs(root) return the root and the last node of the list(tree).
This can be considered into four cases. The list structure is [root, Lsubtree, Rsubtree].
Code
# 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 []
print(root)
def dfs(root):
if not root.left and not root.right:
return root, root
if not root.left:
rootr, leafr = dfs(root.right)
return root, leafr
if not root.right:
rootl, leafl = dfs(root.left)
root.left = None
root.right = rootl
return root, leafl
rootr, leafr = dfs(root.right)
rootl, leafl = dfs(root.left)
root.left = None
root.right = rootl
leafl.right = rootr
return root, leafr
rootr, leafr = dfs(root)