1、题目描述
https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list/
给定一个二叉树,原地将它展开为一个单链表。
2、代码详解
# Definition for a binary tree node.
class TreeNode(object):
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution(object):
def flatten(self, root):
"""
:type root: TreeNode
:rtype: None Do not return anything, modify root in-place instead.
"""
def dfs(root):
if not root:
return
dfs(root.left)
dfs(root.right)
# 采用后序遍历,左-右-打印根 顺序遍历二叉树
# 当遍历到根节点后,对根节点的左右子树做一些调整
# 将右子树挂到 左子树的最右边
# 再将整个左子树挂到根节点的右边
if root.left != None:
pre = root.left # 令 pre 指向左子树
while pre.right:
pre = pre.right # 找到左子树中的最右节点
pre.right = root.right # 将右子树挂到 左子树的最右边(令左子树中的最右节点的右子树 指向 根节点的右子树)
root.right = root.left # 再将整个左子树挂到根节点的右边(令根节点的右子树指向根节点的左子树)
root.left = None # 置空根节点的左子树
dfs(root)
- 时间复杂度:O(N)
- 空间复杂度:O(h),h是树高度