Flatten Binary Tree to Linked List

Flatten a binary tree to a fake "linked list" in pre-order traversal.

Here we use the_right_pointer in TreeNode as the_next_pointer in ListNode.

Example

              1
               \
     1          2
    / \          \
   2   5    =>    3
  / \   \          \
 3   4   6          4
                     \
                      5
                       \
                        6

Traverse Pre-Order

首先来看递归版本的,思路是先利用DFS的思路找到最左子节点,然后回到其父节点,我们需要一个 pointer last来保存父节点,然后

我们需要把右子树临时保存起来,因为把左子树添加到右子树位置时会把原先的右子树覆盖掉。再然后将原左子结点连上父节点的右子节点上,然后再把原右子节点连到新右子节点的右子节点上,然后再回到上一父节点做相同操作。

     1
    / \
   2   5
  / \   \
 3   4   6

     1
    / \
   2   5
    \   \
     3   6
      \    
       4

   1
    \
     2
      \
       3
        \
         4
          \
           5
            \
             6
"""
Definition of TreeNode:
class TreeNode:
    def __init__(self, val):
        this.val = val
        this.left, this.right = None, None
"""
class Solution:
    # @param root: a TreeNode, the root of the binary tree
    # @return: nothing
    last = None
    def flatten(self, root):
        # write your code here
        if not root:
            return
        if self.last!=None:
            self.last.left = None
            self.last.right = root

        self.last = root
        # 临时保存右节点
        right = self.last.right
        # 进入左子树
        self.flatten(root.left)
        # 进入原来的右子树
        self.flatten(right)

递归后序遍历(Recursive Postorder Traversal)

这里对标准的递归后序遍历稍作改动,由“左-右-根”变更为“右-左-根”,详见代码。

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def flatten(self, root):
        """
        :type root: TreeNode
        :rtype: void Do not return anything, modify root in-place instead.
        """
        self.pointer = None
        def traverse(root):
            if not root: return
            traverse(root.right)
            traverse(root.left)
            root.right = self.pointer
            root.left = None
            self.pointer = root
        traverse(root)

没写完!!!!!

Last updated

Was this helpful?