二叉树层序遍历,然后串成一个单链表,不允许用队列,要求空间复杂度为常数
struct Node { int value; Node *left; Node *right; Node *next; }; Node *Func(Node *root) { if (NULL == root) return NULL; Node *p1 = root, *p2 = root; p2->next = p2->left; if (NULL != p2->left) { p2->left->next = p2->right; else return root; if (NULL == p2->right) return root; p2 = p2->next; while (NULL != p2) { if (NULL != p2->left) { p2->left->next = p2->right; } if (NULL != p1->right) { p1->right->next = p2->left; } p1 = p1->next; p2 = p2->next; } return root; }
leetcode Populating Next Right Pointers in Each Node II
解法1:
/** * Definition for binary tree with next pointer. * 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==NULL)return; TreeLinkNode *p=root,*q,*r=root; if(p->left)r=p->left; else if(p->right)r=p->right; else return; TreeLinkNode *work; while(p) { work=r; q=p; p=r; while(q) { if(q->left&&q->left!=r) { work->next=q->left; work=work->next; } if(q->right&&q->right!=r) { work->next=q->right; work=work->next; } q=q->next; } for(work=r;work;work=work->next) { if(work->left){r=work->left;break;} if(work->right){r=work->right;break;} } if(work==NULL)break; } } };
超牛逼解法,来自leetcode
class Solution { public: void connect(TreeLinkNode *root) { while (root) { TreeLinkNode * first= NULL; // the first node of next level TreeLinkNode * prev = NULL; // previous node on the same level for (; root; root=root->next) { if (first==NULL) first= root->left?root->left:root->right; if (root->left) { if (prev) prev->next = root->left; prev = root->left; } if (root->right) { if (prev) prev->next = root->right; prev = root->right; } } root = first; // turn to next level } }