二叉树层次遍历串成单链表

二叉树层序遍历,然后串成一个单链表,不允许用队列,要求空间复杂度为常数

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
    }
}
原文地址:https://www.cnblogs.com/tgkx1054/p/3068936.html