117. Populating Next Right Pointers in Each Node II

来源:互联网 发布:软件测试项目心得体会 编辑:程序博客网 时间:2024/05/16 09:02

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
Subscribe to see which companies asked this question
low一点的方法:同116 Populating Next Right Pointers in Each Node,的方法一一样,采用层次遍历的思想来解决,但运行时间长点,代码:

void connect(TreeLinkNode *root) {         if(NULL == root)            return;        queue<TreeLinkNode*> que;        que.push(root);        int curLenNode = 1;        TreeLinkNode* pre = NULL;        while(!que.empty())        {            TreeLinkNode *temp = que.front();            que.pop();            curLenNode --;            if(pre != NULL)                pre->next = temp;            pre = temp;            if(temp->left)                que.push(temp->left);            if(temp->right)                que.push(temp->right);            if(curLenNode == 0)            {                pre = NULL; //注意在每一层遍历结束,都要将pre设置为NULL,否则Pre保留的是上一层的最后一个节点,故而会有问题                temp->next = NULL;//最每一层的最后会将当前层的最后一个节点的next赋值为NULL                curLenNode = que.size();            }        }    }

更好的方法值得推敲:

public void connect(TreeLinkNode root) {        TreeLinkNode head = null; //head of the next level        TreeLinkNode prev = null; //the leading node on the next level        TreeLinkNode cur = root;  //current node of current level        while (cur != null) {            while (cur != null) { //iterate on the current level                //left child                if (cur.left != null) {                    if (prev != null) {                        prev.next = cur.left;                    } else {                        head = cur.left;                    }                    prev = cur.left;                }                //right child                if (cur.right != null) {                    if (prev != null) {                        prev.next = cur.right;                    } else {                        head = cur.right;                    }                    prev = cur.right;                }                //move to next node                cur = cur.next;            }            //move to next level            cur = head;            head = null;            prev = null;        }    }

更好的方法二:
https://discuss.leetcode.com/topic/18119/simple-40ms-c-o-n-o-1-solution-with-only-one-while-loop

0 0