[LeetCode] Populate the next right pointer in binary tree II

这篇文章给出的算法,只适用于complete binary tree;如果是任意形状的二叉树,则不适用。

下面给出一个算法,适用于任意形状的二叉树。

算法一:思路见geekforgeeks。该算法被leetcode给出了超时的错误。

void connect(TreeLinkNode *root) {
    // main function 
    
    if(root==NULL)
        return;
    
    // Set the nextRight for root
    root->next = NULL;
 
    // Set the next right for rest of the nodes (other than root)
    connectRecur(root);        
}
    
/* Set next right of all descendents of p. This function makes sure that
next of nodes ar level i is set before level i+1 nodes. */
void connectRecur(TreeLinkNode* p)
{
    // Base case
    if (!p)
       return;
 
    /* Before setting next of left and right children, set next
    of children of other nodes at same level (because we can access 
    children of other nodes using p's next only) */
    if (p->next != NULL)
       connectRecur(p->next);
 
    /* Set the next pointer for p's left child */
    if (p->left)
    {
       if (p->right)
       {
           p->left->next = p->right;
           p->right->next = getnext(p);
       }
       else
           p->left->next = getnext(p);
 
       /* Recursively call for next level nodes.  Note that we call only
       for left child. The call for left child will call for right child */
       connectRecur(p->left);
    }
 
    /* If left child is NULL then first node of next level will either be
      p->right or getnext(p) */
    else if (p->right)
    {
        p->right->next = getnext(p);
        connectRecur(p->right);
    }
    else
       connectRecur(getnext(p));
}

TreeLinkNode *getnext(TreeLinkNode *p)
{
    TreeLinkNode *temp = p->next;
 
    /* Traverse nodes at p's level and find and return
       the first node's first child */
    while(temp != NULL)
    {
        if(temp->left != NULL)
            return temp->left;
        if(temp->right != NULL)
            return temp->right;
        temp = temp->next;
    }
 
    // If all the nodes at p's level are leaf nodes then return NULL
    return NULL;
}

算法二测试通过:

来源:http://yucoding.blogspot.com/2013/04/leetcode-question-73-populating-next.html

下面算法的思路和http://blog.csdn.net/jiyanfeng1/article/details/8616949的第二个算法的思路是一样的。

    void dfs(TreeLinkNode *root){
        if (!root){return;}  // if current node is not valid return
         
        if (root->next==NULL){ // if current node is not in the right boundary of this level
            if (root->right){root->right->next = NULL;} // if has right child, its next is null
            if (root->left){root->left->next = root->right;}//if has left child, its next is its right
        }else{ // if the current node has next node in its right
            TreeLinkNode* p = root->next; //the pointer travle along this level 
            TreeLinkNode* q=NULL; // the next valid pointer in the level+1 , or NULL if not found
            while (p){ //find the next valid child of root node
                if (p->left){q =p->left; break;}
                if (p->right){q =p->right; break;}
                p=p->next;
            }
            if (root->right){root->right->next = q;} //set right child if exists
            if (root->left && root->right ){root->left->next = root->right;}//set left if right exists
            if (root->left && !root->right) {root->left->next = q;} // set left if right not exist
        }
         
        dfs(root->right); // search right child, order is important
        dfs(root->left);  // search left child
    }
    void connect(TreeLinkNode *root) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if (!root){return;}
        root->next = NULL;
        dfs(root);
    }


你可能感兴趣的:(LeetCode)