題目:
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
題解:
這道題跟I的區別就是binary tree不是完全二叉樹。
所以root.right.next就不一定等於root.next.left。
所以,目標就是先確定好root的右孩子的第一個有效next連線點,然後再處理左孩子。
程式碼如下:
1 public void connect(TreeLinkNode root) {
2 if (root == null)
3 return;
4
5 TreeLinkNode p = root.next;
6 /*
7 因此,這道題目首要是找到右孩子的第一個有效的next連結節點,然後再處理左孩子。然後依次遞迴處理右孩子,左孩子
8 */
9 while (p != null) {
10 if (p.left != null) {
11 p = p.left;
12 break;
13 }
14 if (p.right != null) {
15 p = p.right;
16 break;
17 }
18 p = p.next;
19 }
20
21 if (root.right != null) {
22 root.right.next = p;
23 }
24
25 if (root.left != null) {
26 if(root.right!=null)
27 root.left.next = root.right;
28 else
29 root.left.next = p;
30 }
31
32 connect(root.right);
33 connect(root.left);
34 }
2 if (root == null)
3 return;
4
5 TreeLinkNode p = root.next;
6 /*
7 因此,這道題目首要是找到右孩子的第一個有效的next連結節點,然後再處理左孩子。然後依次遞迴處理右孩子,左孩子
8 */
9 while (p != null) {
10 if (p.left != null) {
11 p = p.left;
12 break;
13 }
14 if (p.right != null) {
15 p = p.right;
16 break;
17 }
18 p = p.next;
19 }
20
21 if (root.right != null) {
22 root.right.next = p;
23 }
24
25 if (root.left != null) {
26 if(root.right!=null)
27 root.left.next = root.right;
28 else
29 root.left.next = p;
30 }
31
32 connect(root.right);
33 connect(root.left);
34 }