题目:
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
