题目
分析题目
分析题目可知,这道题目用到的数据结构为二叉树,并且需要对二叉树中的每个点进行处理。
因此可以想到需要遍历整棵树。
问题就转变为应该采用什么遍历方法。
因为结果只与右侧节点有关,所以应该采用层序遍历较为简单。
经过以上分析可知这道题用到的算法是:广度优先遍历。
代码
class Solution {
public:
Node* connect(Node* root) {
//广度优先遍历
queue<Node*> quene;
//注意这里不要忘记考虑空指针的情况
if(!root)return NULL;
quene.push(root);
Node* now = NULL;
Node* pre = NULL;
while (!quene.empty()){
int size = quene.size();
pre = NULL;
for(int i=0;i<size;i++)
{
now = quene.front();
quene.pop();
now->next=pre;
pre = now;
//因为将pre初始化为NULL,所以应该从右侧开始遍历
//从左侧开始遍历的话,会为得知右侧的值带来困难
//当从某个方向遍历得到结果比较困难时,可以试一试从反方向进行遍历
if(now->right)quene.push(now->right);
if(now->left)quene.push(now->left);
}
}
return root;
}
};
复习BFS算法
void bfs(Node* node) {
if (node == nullptr) return;
queue<Node*> q;
q.push(node);
node->visited = true;
while (!q.empty()) {
Node* curr = q.front();
q.pop();
cout << curr->value << " ";
for (auto neighbor : curr->neighbors) {
if (!neighbor->visited) {
neighbor->visited = true;
q.push(neighbor);
}
}
}
}