zoukankan      html  css  js  c++  java
  • 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;
    }
    }
    

      

  • 相关阅读:
    JS实战 · 表单验证
    JS实战 · 仿css样式选择器
    JS实战 ·  收缩菜单表单布局
    cookie自动登录的实现
    redis 3.2.5单机版安装、使用、systemctl管理Redis启动、停止、开机启动
    yum问题解决
    配置yum镜像源
    shell笔记
    CCIE总结:路由器、交换机
    云主机如何挂在磁盘
  • 原文地址:https://www.cnblogs.com/LiCheng-/p/6868046.html
Copyright © 2011-2022 走看看