• LeetCode | 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

      题目的大致意思是:使用O(1)的空间对树进行遍历,并且设置next指针。因此不能使用递归和队列进行广度优先搜索。
      解题思路: 采用指针,进行二叉树的广度优先搜索。总体是设置3个指针,分别为parent, pre, next。
    其中parent执行当前要设置next指针的上层节点。pre指向当前要设置next指针的节点, next指向下层的开始节点(因为不是完全二叉树)
     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) {
    12             return;
    13         }
    14         TreeLinkNode pre ;//用于设置next节点
    15         TreeLinkNode next ; //标记下一行的开始节点
    16         TreeLinkNode parent = root;//
    17         
    18          while(parent != null) {
    19             pre = null;
    20             next = null;
    21             while(parent != null) {//对一行设置next值
    22                 if (next == null) { //找到parent的下一行第一个节点
    23                     next = (parent.left != null) ? parent.left : parent.right;
    24                 }
    25                 
    26                 if (parent.left != null) { //parent存在子节点
    27                     if (pre == null) {  //如果pre为空,说明parent.left为下一行的第一个节点,因此让pre指向它
    28                         pre = parent.left;
    29                     }else{  //pre不为空,设置pre的next指针
    30                         pre.next = parent.left; 
    31                         pre = pre.next;
    32                     }
    33                 }
    34                 if (parent.right != null) {
    35                     if (pre == null) {
    36                         pre = parent.right;
    37                     }else{
    38                         pre.next = parent.right;
    39                         pre = pre.next;
    40                     }
    41                 }
    42                 
    43                 parent = parent.next;//遍历parent的下一个节点
    44             }
    45             parent = next;//parent指向下一行的开始节点
    46         }
    47     }
    48 }
     
  • 相关阅读:
    CCF-Python的内置函数们
    CCF2019-03-Python题解
    Find a Number (记忆化+BFS)
    LeetCode15:三数之和(双指针)
    LeetCode:不用加号的加法(位运算)
    剑指Offer43:1~n整数中1出现的次数(数位DP)
    LeetCode190:颠倒二进制(位运算分治! 时间复杂度O(1))
    LeetCode5716:好因子的最大数目(数学、快速幂)
    python学习笔记:python的字符串拼接效率分析
    LeetCode1806:还原排列的最少操作步数(置换群 or 模拟)
  • 原文地址:https://www.cnblogs.com/huangyichun/p/7088487.html
Copyright © 2020-2023  润新知