zoukankan      html  css  js  c++  java
  • 156. Binary Tree Upside Down

    https://leetcode.com/problems/binary-tree-upside-down/description/

    Given a binary tree where all the right nodes are either leaf nodes with a sibling (a left node that shares the same parent node) or empty, flip it upside down and turn it into a tree where the original right nodes turned into left leaf nodes. Return the new root.

    For example:
    Given a binary tree {1,2,3,4,5},

        1
       / 
      2   3
     / 
    4   5
    

    return the root of the binary tree [4,5,2,#,#,3,1].

       4
      / 
     5   2
        / 
       3   1  
    

     

     

    Sol 1:

     

     

    This is not a very intuitive problem for me, I have to spent quite a while drawing figures to understand it. As shown in the figure, 1 shows the original tree, you can think about it as a comb, with 1, 2, 4 form the bone, and 3, 5 as the teeth. All we need to do is flip the teeth direction as shown in figure 2. We will remove the link 1--3, 2--5, and add link 2--3, and 4--5. And node 4 will be the new root.

    As the recursive solution, we will keep recurse on the left child and once we are are done, we found the newRoot, which is 4 for this case. At this point, we will need to set the new children for node 2, basically the new left node is 3, and right node is 1. Here is the recursive solution:

     

     

     

     

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    
    // recursion
    
    public class Solution {
        public TreeNode upsideDownBinaryTree(TreeNode root) {
            if (root == null || root.left == null){
                return root;
            }
            
            TreeNode newRoot = upsideDownBinaryTree(root.left);
            root.left.left = root.right; // node 2 left children
            root.left.right = root; //node 2 right children
            root.left = null;
            root.right = null;
            return newRoot;
            
        
            
        }
    }

    Sol 2:

    For the iterative solution, it follows the same thought, the only thing we need to pay attention to is to save the node information that will be overwritten.

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    
    // For the iterative solution, it follows the same thought, the only thing we need to pay attention to is to save the node information that will be overwritten.
    
    public class Solution {
        public TreeNode upsideDownBinaryTree(TreeNode root) {
            TreeNode curr = root;
            TreeNode next = null;
            TreeNode temp = null;
            TreeNode prev = null;
            
            while (curr != null){
                next = curr.left;
                
                // swapping nodes now, need temp to keep the previous right child
                // create the new left connection
                curr.left = temp;
                // create the new right connection, but store the previous one
                temp = curr.right;
                curr.right = prev;
                
                // advance
                prev = curr;
                curr = next;
            }
            
            return prev;
            
        
            
        }
    }
  • 相关阅读:
    H5 通过腾讯地图api定点位置
    常见的css的效果--箭头--三角形--条纹
    vue+element 给表格添加数据,页面不实时刷新的问题
    js 压缩图片
    利用NBI可视化+influxDB时序数据库构建物联网大数据分析平台
    利用NBI大数据可视化工具做RFM模型分析,洞察数据价值,驱动业务增长
    利用Python+NBI大数据可视化工具实现采集到分析整体方案
    类库封装log4net
    浅析Golang的线程模型与调度器
    Python字符串转换为日期时间– strptime
  • 原文地址:https://www.cnblogs.com/prmlab/p/7294356.html
Copyright © 2011-2022 走看看