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 }
 
原文地址:https://www.cnblogs.com/huangyichun/p/7088487.html