思路:
根据二叉树的前序遍历,先得到二叉数的前序遍历列表,再转为单链表。转为单链表的时候,左节点为None。
# 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.
"""
#前序遍历
# 先弄成数组,再弄成单链表
# root.left=None root.right=root.val
preorderlist=list()
def preorder(root):
if not root:
return
preorderlist.append(root)
preorder(root.left)
preorder(root.right)
preorder(root)
n=len(preorderlist)
for i in range(1,n):
prev,cur=preorderlist[i-1],preorderlist[i]
prev.left=None
prev.right=cur
思路2:
迭代法:一边遍历,一边构建单链表,
运用栈,每次从栈内弹出一个节点作为当前访问的节点,获得该节点的子节点,如果子节点不为空,则依次将右子节点和左子节点压入栈内(注意入栈顺序先右后左)。
展开为单链表的做法是,维护上一个访问的节点 prev,每次访问一个节点时,令当前访问的节点为 curr,将 prev 的左子节点设为 null 以及将 prev 的右子节点设为 curr,然后将 curr 赋值给 prev,进入下一个节点的访问,直到遍历结束。需要注意的是,初始时 prev 为 null,只有在 prev 不为 null 时才能对 prev 的左右子节点进行更新。
# 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.
"""
#前序遍历
# 先弄成数组,再弄成单链表
# root.left=None root.right=root.val
# preorderlist=list()
# def preorder(root):
# if not root:
# return
# preorderlist.append(root)
# preorder(root.left)
# preorder(root.right)
# preorder(root)
# n=len(preorderlist)
# for i in range(1,n):
# prev,cur=preorderlist[i-1],preorderlist[i]
# prev.left=None
# prev.right=cur
if not root:
return
stack=[root]
prev=None
while stack:
cur=stack.pop()
left,right=cur.left,cur.right
if right:
stack.append(right)
if left:
stack.append(left)
if prev:
prev.left=None
prev.right=cur
prev=cur