将二叉树展开为链表,考虑用递归的方式,在二叉树原有结构上操作。空间复杂度为O(1)。
以示例1为例:
展开方式为二叉树前序遍历(根左右),以根结点左子树小规模分析。展开(2, 3, 4)的过程为先观察2号节点有无左子树,若有,先将2号节点右子树转移至左子树的最右端(若无右子树,则转移空节点),后将2号节点左子树转移至2号节点右子树,从而实现根节点左子树的展开变换。接着,将1号节点右子树转移至2号节点的最右端,即将(5, 6)节点转移至2号节点最右端,然后将2号节点及其子树转移至根节点右端,完成展开,注意返回右左根实现递归。
示例1代码:
# 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:
self.flatten_return(root)
def flatten_return(self, root):
if root is None:
return None
left_last = self.flatten_return(root.left)
right_last = self.flatten_return(root.right)
if left_last is not None:
left_last.right = root.right
root.right = root.left
root.left = None
return right_last or left_last or root
注意:
return部分,递归时先返回右子树再返回左子树才能实现逐层递归,直到只剩根节点,递归结束。
回顾:
二叉树前序遍历:
LeetCode in Python 94. Binary Tree Inorder Traversal (二叉树的中序遍历)-CSDN博客
二叉树中序遍历:
LeetCode in Python 144. Binary Tree Preorder Traversal (二叉树的前序遍历)-CSDN博客
二叉树后序遍历:
LeetCode in Python 144. Binary Tree Postorder Traversal (二叉树的后序遍历)-CSDN博客