时间:2021-1-24
题目地址:https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list/
题目难度:Medium
题目描述:
给定一个二叉树,原地将它展开为一个单链表。
例如,给定二叉树
1
/ \
2 5
/ \ \
3 4 6
将其展开为:
1
\
2
\
3
\
4
\
5
\
6
思路1:递归
一开始理解错了,以为是要换成链表的数据结构,看了labuladong的文章才知道仅仅是换树的形态
二叉树的后序遍历
代码段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: TreeNode) -> None:
"""
Do not return anything, modify root in-place instead.
"""
if root == None:
return None
self.flatten(root.left)
self.flatten(root.right)
left = root.left
right = root.right
root.left = None
root.right = left
p = root
while p.right != None:
p = p.right
p.right = right
总结:
- 递归总是容易跳到里边去。还是得多练习。
思路2:挨个处理每个节点
代码段2:通过
# 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: TreeNode) -> None:
"""
Do not return anything, modify root in-place instead.
"""
while root:
if root.left: # 如果左子树存在
sub_left = root.left
while sub_left.right:
sub_left = sub_left.right # 左子树的右子树找到底
sub_left.right = root.right # root的右子树挂到左子树的右子树最深
root.right = root.left # root的左子树挂到右子树
root.left = None # root的左子树清空
root = root.right
总结:
- 这个思路挺清晰的,我一开始把题意理解错了。