LeetCode 114. Flatten Binary Tree to Linked List

原题

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

For example,
Given

         1
        / 
       2   5
      /    
     3   4   6

The flattened tree should look like:

   1
    
     2
      
       3
        
         4
          
           5
            
             6
Hints:

If you notice carefully in the flattened tree, each node's right child points to the next node of a pre-order traversal.

题目大意就是让你将一个二叉树转化为一个只有右子节点的扁平树,且每一个节点的右孩子都是他前序遍历的下一个节点

解题思路

思路一:按照该树的前序遍历结果,重新构造扁平树

思路二:循环遍历,每次将节点的右子树接到左子树的最右节点下,然后再将左子树赋值给右子树,左子树置为空,直到循环到最底层节点为止

思路三:正向递归,既然每一个节点的右孩子都是他前序遍历的下一个节点,那么可以采取反向后序遍历的方式,这样遍历的结果和前序遍历的值正好是互逆的。

代码实现

思路一:

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


# 先序遍历,然后将遍历结果重新赋值给root
class Solution(object):
    def flatten(self, root):
        """
        :type root: TreeNode
        :rtype: void Do not return anything, modify root in-place instead.
        """
        self.POrder = []
        self.preOrder(root)
        if len(self.POrder) == 0:
            return
        del self.POrder[0]
        root.left = None
        for i in self.POrder:
            root.right = TreeNode(i)
            root = root.right
        
    def preOrder(self, node):
        if node == None:
            return 
        self.POrder.append(node.val)
        self.preOrder(node.left)
        self.preOrder(node.right)

  

思路二:

# 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.
        """
        while root:
            if root.left:
                itr = root.left
                while itr.right:
                    itr = itr.right
                itr.right = root.right
                root.left, root.right = None, root.left
            root = root.right

  

思路三:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    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;
}
}

  

原文地址:https://www.cnblogs.com/LiCheng-/p/6868046.html