• 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 }
     
  • 相关阅读:
    第六章 编译并运行程序
    第五章 顺序型编程进阶
    第四章 异常
    第三章 顺序型编程
    TCP和UDP的区别和优缺点
    Java UDP Socket编程
    springboot 学习资源推荐
    springboot集成redis
    微信公众号的SpringBoot+Quartz的定时任务Demo
    远程桌面发生身份验证错误,要求的函数不受支持【WIN10家庭】或【专业版】--解决办法
  • 原文地址:https://www.cnblogs.com/huangyichun/p/7088487.html
Copyright © 2020-2023  润新知