chapter-four/0100~0199/0114.Flatten-Binary-Tree-to-Linked-List

114. Flatten Binary Tree to Linked List

题目

Given a binary tree, flatten it to a linked list in-place.

For example, given the following tree:

	1
   / \
  2   5
 / \   \
3   4   6

The flattened tree should look like:

1
 \
  2
   \
    3
     \
      4
       \
        5
         \
          6

题目大意

给定一个二叉树,原地将它展开为链表。

解题思路

  • 要求把二叉树“打平”,按照先根遍历的顺序,把树的结点都放在右结点中。

  • 按照递归和非递归思路实现即可。

  • 递归的思路可以这么想:倒序遍历一颗树,即是先遍历右孩子,然后遍历左孩子,最后再遍历根节点。

      		1
         / \
        2   5
       / \   \
      3   4   6
      -----------        
      pre = 5
      cur = 4
      
          1
         / 
        2   
       / \   
      3   4
           \
            5
             \
              6
      -----------        
      pre = 4
      cur = 3
      
          1
         / 
        2   
       /   
      3 
       \
        4
         \
          5
           \
            6
      -----------        
      cur = 2
      pre = 3
      
          1
         / 
        2   
         \
          3 
           \
            4
             \
              5
               \
                6
      -----------        
      cur = 1
      pre = 2
      
      1
       \
        2
         \
          3
           \
            4
             \
              5
               \
                6
    
  • 可以先仿造先根遍历的代码,写出这个倒序遍历的逻辑:

      public void flatten(TreeNode root) {
          if (root == null)
              return;
          flatten(root.right);
          flatten(root.left);
      }
    
  • 实现了倒序遍历的逻辑以后,再进行结点之间的拼接:

      private TreeNode prev = null;
      
      public void flatten(TreeNode root) {
          if (root == null)
              return;
          flatten(root.right);
          flatten(root.left);
          root.right = prev;
          root.left = null;
          prev = root;
      }
    

代码

package leetcode /** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ // 解法一 非递归 func flatten(root *TreeNode) { list, cur := []int{}, &TreeNode{} preorder(root, &list) cur = root for i := 1; i < len(list); i++ { cur.Left = nil cur.Right = &TreeNode{Val: list[i], Left: nil, Right: nil} cur = cur.Right } return } // 解法二 递归 func flatten1(root *TreeNode) { if root == nil || (root.Left == nil && root.Right == nil) { return } flatten(root.Left) flatten(root.Right) currRight := root.Right root.Right = root.Left root.Left = nil for root.Right != nil { root = root.Right } root.Right = currRight } // 解法三 递归 func flatten2(root *TreeNode) { if root == nil { return } flatten(root.Right) if root.Left == nil { return } flatten(root.Left) p := root.Left for p.Right != nil { p = p.Right } p.Right = root.Right root.Right = root.Left root.Left = nil }