树节点的结构如下:
struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; }
给定如下完美二叉树(所有叶子节点都在同一层,每个内部节点都有两个儿子):
1 / \ 2 3 / \ / \ 4 5 6 7
需要完成的结果如下,其中横向的为next指针:
1 -> NULL / \ 2 -> 3 -> NULL / \ / \ 4->5->6->7 -> NULL用常数空间来解决。
void connect(TreeLinkNode *root) {
TreeLinkNode *leftWall = root;
while (leftWall != NULL) {
TreeLinkNode *across = leftWall;
while (across != NULL) {
if (across->left != NULL)
across->left->next = across->right;
if (across->right != NULL && across->next != NULL)
across->right->next = across->next->left;
across = across->next;
}
leftWall = leftWall->left;
}
}
现在,问题扩展一下,给定的不是完美二叉树,
1 / \ 2 3 / \ \ 4 5 7
要完成的结果如下:
1 -> NULL / \ 2 -> 3 -> NULL / \ \ 4-> 5 -> 7 -> NULL同样只需用常数空间。
void connect(TreeLinkNode * n) {
while (n) {
TreeLinkNode * next = NULL; // the first node of next level
TreeLinkNode * prev = NULL; // previous node on the same level
for (; n; n=n->next) {
if (!next) next = n->left?n->left:n->right;
if (n->left) {
if (prev) prev->next = n->left;
prev = n->left;
}
if (n->right) {
if (prev) prev->next = n->right;
prev = n->right;
}
}
n = next; // turn to next level
}
}