• 117. Populating Next Right Pointers in Each Node II


    题目:

    Follow up for problem "Populating Next Right Pointers in Each Node".

    What if the given tree could be any binary tree? Would your previous solution still work?

    Note:

    • You may only use constant extra space.

    For example,
    Given the following binary tree,

             1
           /  
          2    3
         /     
        4   5    7
    

    After calling your function, the tree should look like:

             1 -> NULL
           /  
          2 -> 3 -> NULL
         /     
        4-> 5 -> 7 -> NULL

    链接: http://leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/

    4/16/2017

    BB电面准备

    抄别人的答案,但是递归应该不是constant extra space

    注意的问题

    1. 第13-15要在root层一直找到root.next整个表中子树不为0的情况

    2. 第17行找到子树层可以用于子树层next的节点

    3. 第18,19行给子树层找到next

    4. 最重要的是先找right再找left

    复制代码
     1 /**
     2  * Definition for binary tree with next pointer.
     3  * public class TreeLinkNode {
     4  *     int val;
     5  *     TreeLinkNode left, right, next;
     6  *     TreeLinkNode(int x) { val = x; }
     7  * }
     8  */
     9 public class Solution {
    10     public void connect(TreeLinkNode root) {
    11         if (root == null) return;
    12         TreeLinkNode nextNode = root.next;
    13         while (nextNode != null) {
    14             if (nextNode.left == null && nextNode.right == null) nextNode = nextNode.next;
    15             else break;
    16         }
    17         if (nextNode != null) nextNode = (nextNode.left == null? nextNode.right: nextNode.left);
    18         if (root.right != null) root.right.next = nextNode;
    19         if (root.left != null) root.left.next = (root.right == null? nextNode: root.right);
    20         connect(root.right);
    21         connect(root.left);
    22     }
    23 }
    复制代码

    别人的答案,iterative方法

    这种还是需要分层的方法,什么手段可以分层?可以多用几个指针,并且在next层每一个元素都同时有current层的元素指到。

    https://discuss.leetcode.com/topic/8447/simple-solution-using-constant-space

    复制代码
     1 public class Solution {
     2     public void connect(TreeLinkNode root) {
     3         
     4         while(root != null){
     5             TreeLinkNode tempChild = new TreeLinkNode(0);
     6             TreeLinkNode currentChild = tempChild;
     7             while(root!=null){
     8                 if(root.left != null) { currentChild.next = root.left; currentChild = currentChild.next;}
     9                 if(root.right != null) { currentChild.next = root.right; currentChild = currentChild.next;}
    10                 root = root.next;
    11             }
    12             root = tempChild.next;
    13         }
    14     }
    15 }
    复制代码

    https://discuss.leetcode.com/topic/1106/o-1-space-o-n-complexity-iterative-solution

    复制代码
     1 public class Solution {
     2     
     3     //based on level order traversal
     4     public void connect(TreeLinkNode root) {
     5 
     6         TreeLinkNode head = null; //head of the next level
     7         TreeLinkNode prev = null; //the leading node on the next level
     8         TreeLinkNode cur = root;  //current node of current level
     9 
    10         while (cur != null) {
    11             
    12             while (cur != null) { //iterate on the current level
    13                 //left child
    14                 if (cur.left != null) {
    15                     if (prev != null) {
    16                         prev.next = cur.left;
    17                     } else {
    18                         head = cur.left;
    19                     }
    20                     prev = cur.left;
    21                 }
    22                 //right child
    23                 if (cur.right != null) {
    24                     if (prev != null) {
    25                         prev.next = cur.right;
    26                     } else {
    27                         head = cur.right;
    28                     }
    29                     prev = cur.right;
    30                 }
    31                 //move to next node
    32                 cur = cur.next;
    33             }
    34             
    35             //move to next level
    36             cur = head;
    37             head = null;
    38             prev = null;
    39         }
    40         
    41     }
    42 }
    复制代码

    更多讨论:

    https://discuss.leetcode.com/category/125/populating-next-right-pointers-in-each-node-ii 

  • 相关阅读:
    维特比(Viterbi)算法解最优状态序列
    c#重要知识点复习1---程序流程控制
    学C# Hook原理及EasyHook简易教程
    EmguCV 绘画图形
    EmguCV创建/保存图片
    EmguCV中图像类型进行转换
    basler 相机拍照简单类综合Emgu.CV---得到图档--原创
    RotatedRect 类的用法
    EmguCv“线段” 结构类型学习
    aforge 学习-基本图像处理要用的类库
  • 原文地址:https://www.cnblogs.com/panini/p/6721171.html
Copyright © 2020-2023  润新知