Populating Next Right Pointers in Each Node II

来看这个题,https://leetcode.com/problems/…,要求常数空间,想了想,没想到,找了答案,是这样

class Solution {
public:
    void connect(TreeLinkNode *root) {
        if (!root) {
            return;
        }
        TreeLinkNode dummy(-1);
        for (TreeLinkNode *prev = &dummy, *curr = root; curr; curr = curr->next) {
            if (curr->left) {
                prev->next = curr->left;
                prev = prev->next;
            }
            if (curr->right) {
                prev->next = curr->right;
                prev = prev->next;
            }
        }
        connect(dummy.next);
    }
};

脑子里跑了一遍,感觉理解不了啊,想不通的是,5->7 的那个连接是怎么连上去的

         1 -> NULL
       /  \
      2 -> 3 -> NULL
     / \    \
    4-> 5 -> 7 -> NULL

如果你看上面的代码可以理解 5->7 的连接,后面的就不用看了,不行的话,看这个,写了一个 debug 代码

#include <stdio.h>
struct TreeLinkNode {
 int val;
 TreeLinkNode *left, *right, *next;
 TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {}
};
class Solution {
public:
    void connect(TreeLinkNode *root) {
        if (!root) {
            return;
        }
        TreeLinkNode dummy(-1);
        for (TreeLinkNode *prev = &dummy, *curr = root; curr; curr = curr->next) {
            if (curr->left) {
				printf("connecting %p(%d) to %p(%d)\n", prev, prev?prev->val:0, curr->left, curr->left->val);
                prev->next = curr->left;
                prev = prev->next;
            }
			if (curr->right) {
				printf("connecting %p(%d) to %p(%d)\n", prev, prev?prev->val:0, curr->right, curr->right->val);
                prev->next = curr->right;
                prev = prev->next;
            }
        }
        connect(dummy.next);
    }
};
void print(TreeLinkNode* node) {
	printf("%p(%d) left:%p(%d) right:%p(%d) next:%p(%d)\n", node, node->val, 
		node->left, node->left?node->left->val:0, 
		node->right, node->right?node->right->val:0,
		node->next, node->next?node->next->val:0);
}
void inOrder(TreeLinkNode* root) {
	if (!root) {
		return;
	}
	print(root);
	inOrder(root->left);
	inOrder(root->right);
}
int main() {
	TreeLinkNode root(1), two(2), three(3), four(4), five(5), six(6), seven(7);
	root.left = &two;
	root.right = &three;
	two.left = &four;
	two.right = &five;
	three.right = &seven;
	inOrder(&root);
	printf("-----------------------------\n");
	Solution solution;
	solution.connect(&root);
	printf("-----------------------------\n");
	inOrder(&root);
	return 0;
}

看一下输出

0012FF1C(1) left:0012FF04(2) right:0012FEEC(3) next:00000000(0)
0012FF04(2) left:0012FED4(4) right:0012FEBC(5) next:00000000(0)
0012FED4(4) left:00000000(0) right:00000000(0) next:00000000(0)
0012FEBC(5) left:00000000(0) right:00000000(0) next:00000000(0)
0012FEEC(3) left:00000000(0) right:0012FE8C(7) next:00000000(0)
0012FE8C(7) left:00000000(0) right:00000000(0) next:00000000(0)
-----------------------------
connecting 0012FD84(-1) to 0012FF04(2)
connecting 0012FF04(2) to 0012FEEC(3)
connecting 0012FC6C(-1) to 0012FED4(4)
connecting 0012FED4(4) to 0012FEBC(5)
connecting 0012FEBC(5) to 0012FE8C(7)
-----------------------------
0012FF1C(1) left:0012FF04(2) right:0012FEEC(3) next:00000000(0)
0012FF04(2) left:0012FED4(4) right:0012FEBC(5) next:0012FEEC(3)
0012FED4(4) left:00000000(0) right:00000000(0) next:0012FEBC(5)
0012FEBC(5) left:00000000(0) right:00000000(0) next:0012FE8C(7)
0012FEEC(3) left:00000000(0) right:0012FE8C(7) next:00000000(0)
0012FE8C(7) left:00000000(0) right:00000000(0) next:00000000(0)

脑子里再过一遍,应该就能理解了

Leave a Reply

Your email address will not be published. Required fields are marked *