二叉树层次遍历串成单链表
二叉树层序遍历,然后串成一个单链表,不允许用队列,要求空间复杂度为常数
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
}
}
浙公网安备 33010602011771号