[leetcode] Populating Next Right Pointers in Each Node II

来源:互联网 发布:淘宝开店详细流程 编辑:程序博客网 时间:2024/05/01 11:49

Follow up for problem "Populating Next Right Pointers in Each Node".

What if the given tree could be any binary tree? Would your previous solution still work?

Note:

  • You may only use constant extra space.

For example,
Given the following binary tree,

         1       /  \      2    3     / \    \    4   5    7

After calling your function, the tree should look like:

         1 -> NULL       /  \      2 -> 3 -> NULL     / \    \    4-> 5 -> 7 -> NULL
/** * 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;        root->next = NULL;        // 先右后左,切记        connect(root, root->right, 1);        connect(root, root->left, 0);            }        void connect(TreeLinkNode *root, TreeLinkNode *child, int flag)    {        if (child == NULL)            return;        if (flag == 0)        {            if (root->right != NULL)                child->next = root->right;            else            {                TreeLinkNode *temp = root->next;                while (temp != NULL && temp->left == NULL && temp->right == NULL)                {                    temp = temp->next;                }                if (temp == NULL)                    child->next = NULL;                else if (temp->left != NULL)                    child->next = temp->left;                else                     child->next = temp->right;            }                        connect(child, child->right, 1);            connect(child, child->left, 0);        } else        {            if (root->next == NULL)                child->next = NULL;            else            {                TreeLinkNode *temp = root->next;                while (temp != NULL && temp->left == NULL && temp->right == NULL)                {                    temp = temp->next;                }                if (temp == NULL)                    child->next = NULL;                else if (temp->left != NULL)                    child->next = temp->left;                else                     child->next = temp->right;            }               connect(child, child->right, 1);            connect(child, child->left, 0);        }    }};
0 0