要点:
(1)把root的右子树 移到 左子树的右子树的右边的空结点上。
(2)将root的整个左子树移到右子树。
(3)将root的左子树清空。
!!!!核心就是反复的将root的右子树移到左子树的右侧最后一个结点的右侧空节点。!!!!
将root指向下一个右侧结点后,就可以反复的处理每个子树的左侧结点,使得其按照根左右的顺序排列。(root的左边结点最后处理,因为要把root的右侧结点全部移到root的左侧结点的右子树的最后)
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):
while root:
if root.left: #如果根节点存在左子树,则p指向根节点的左子树
p = root.left
while p.right: #如果根节点的左子树的右子树存在,则p一直指向其最后一个结点
p = p.right
p.right = root.right #将root的右子树整个移到p的右侧空结点
root.right = root.left #将root的左子树整个移到root的右侧
root.left = None #root的左子树清空
root = root.right #将root移到到下一个结点
def headPrint(self,head):
while head:
print(head.val,end=' ')
head = head.right
node = TreeNode(1)
node.left = TreeNode(2)
node.right = TreeNode(5)
node.left.left = TreeNode(3)
node.left.right = TreeNode(4)
a = Solution()
a.flatten(node)
b = a.headPrint(node)
print(b)