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
和上一道题一样,代码一样使用,就是做一个简单的BFS广度优先遍历。
代码如下:
import java.util.ArrayList;
import java.util.List;
/*class TreeLinkNode
{
int val;
TreeLinkNode left, right, next;
TreeLinkNode(int x) { val = x; }
}
*/
/*
* 就是一个BFS广度优先遍历
* */
public class Solution
{
public void connect(TreeLinkNode root)
{
if(root == null)
return;
List<TreeLinkNode> myQueue = new ArrayList<TreeLinkNode>();
myQueue.add(root);
int count = 1;
while(myQueue.isEmpty()==false)
{
int tmp = 0;
for(int i=0;i<count-1;i++)
{
if(myQueue.get(0).left!=null)
{
myQueue.add(myQueue.get(0).left);
tmp++;
}
if(myQueue.get(0).right!=null)
{
myQueue.add(myQueue.get(0).right);
tmp++;
}
myQueue.get(0).next = myQueue.get(1);
myQueue.remove(0);
}
if(myQueue.get(0).left!=null)
{
myQueue.add(myQueue.get(0).left);
tmp++;
}
if(myQueue.get(0).right!=null)
{
myQueue.add(myQueue.get(0).right);
tmp++;
}
myQueue.get(0).next = null;
myQueue.remove(0);
count = tmp;
}
}
}
下面是C++的做法,和上一道题一样,就是做一个BFS广度优先遍历
代码如下:
#include <iostream>
#include <string>
#include <vector>
#include <queue>
using namespace std;
/*
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)
{
queue<TreeLinkNode*> que;
if (root == NULL)
return;
que.push(root);
while (que.empty() == false)
{
int size = que.size();
vector<TreeLinkNode*> one;
for (int i = 0; i < size; i++)
{
TreeLinkNode* top = que.front();
que.pop();
one.push_back(top);
if (top->left != NULL)
que.push(top->left);
if (top->right != NULL)
que.push(top->right);
}
for (int i = 0; i <= (int)one.size() - 2; i++)
one[i]->next = one[i + 1];
one[one.size() - 1]->next = NULL;
}
}
};