• [leetcode] 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

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

    https://oj.leetcode.com/problems/flatten-binary-tree-to-linked-list/

    题目要求按照前序遍历转换成一个链表。

    思路:先递归实现左右子树,然后调整指针连接起来。 时间复杂度O(N),每个节点最多访问2次,一次flat,一次findRightMost。 空间复杂度O(N).

    思路2: 基于 Moris Traveral。O(N) 时间,O(1)空间。

    public class Solution {
        public void flatten(TreeNode root) {
            if (root == null)
                return;
    
            flatten(root.left);
            flatten(root.right);
            TreeNode p = root;
            if (p.left == null)
                return;
            else
                p = p.left;
            while (p.right != null)
                p = p.right;
            p.right = root.right;
            root.right = root.left;
            root.left = null;
    
        }
    
        public static void main(String[] args) {
            TreeNode root = new TreeNode(1);
            root.left = new TreeNode(2);
            root.left.left = new TreeNode(3);
            root.left.right = new TreeNode(4);
            root.right = new TreeNode(5);
            root.right.right = new TreeNode(6);
            new Solution().flatten(root);
            ;
        }
    
    }
    View Code

    思路2

    class Solution {
       
        public void flatten(TreeNode root) {
            
            // Handle the null scenario
            if (root == null) {
                return;
            }
            
            TreeNode node = root;
            
            while (node != null) {
                
                // If the node has a left child
                if (node.left != null) {
                    
                    // Find the rightmost node
                    TreeNode rightmost = node.left;
                    while (rightmost.right != null) {
                        rightmost = rightmost.right;
                    }
                    
                    // rewire the connections
                    rightmost.right = node.right;
                    node.right = node.left;
                    node.left = null;
                }
                
                // move on to the right side of the tree
                node = node.right;
            }
        }
    }

    第二遍记录:

    public class Solution {
        public void flatten(TreeNode root) {
            if(root==null)
                return;
            flatten(root.left);
            flatten(root.right);
            if(root.left==null)
                return;
            TreeNode leftEnd=root.left;
            while(leftEnd.right != null)
                leftEnd=leftEnd.right;
            leftEnd.right=root.right;
            root.right=root.left;
            root.left=null;
        }
    
    }

    第三遍记录:

      先递归flaten左右子树,然后根据左右子树(尤其是左子树)的情况,构造链表,最后注意把当前节点的left指针置为null

    public class Solution {
        public void flatten(TreeNode root) {
            flat(root);
        }
    
        private TreeNode flat(TreeNode root) {
            if (root == null)
                return null;
            TreeNode left = flat(root.left);
            TreeNode right = flat(root.right);
    
            if (left == null)
                return root;
            root.right = left;
            TreeNode leftEnd = left;
            while (leftEnd.right != null) {
                leftEnd = leftEnd.right;
            }
            leftEnd.right = right;
            //don't forget this
            root.left = null;
            return root;
        }
    
        public static void main(String[] args) {
            TreeNode root = new TreeNode(1);
            root.left = new TreeNode(2);
            root.left.left = new TreeNode(3);
            root.left.right = new TreeNode(4);
            root.right = new TreeNode(5);
            root.right.right = new TreeNode(6);
            new Solution().flatten(root);
            ;
        }
    
    }

    参考:

    http://blog.csdn.net/havenoidea/article/details/11822019

    http://www.cnblogs.com/feiling/p/3278639.html

  • 相关阅读:
    RabbitMQ高级部分
    深入了解RabbitMQ
    js控制mui-popover弹出与关闭及移动网盘分享文件格式
    Hbuilder页面之间的跳转及关闭功能
    页面下载远程服务器单个及多个文件并打成压缩包下载到本地
    手机端下载文件及创建文件夹
    input上传文件对象
    上传文件解决获取multi=JakartaMultiPartRequest问题
    jsp页面选择文件上传,获取不到绝对路径问题
    activiti官网实例项目activiti-explorer之扩展多选框回显功能
  • 原文地址:https://www.cnblogs.com/jdflyfly/p/3821445.html
Copyright © 2020-2023  润新知