题目分析
①.广度优先搜索
题目要求把二叉树中每一层的的节点连起来,最简单的方法即 BFS ,按层的顺序的对树进行遍历,但需要使用 queue 数据结构,空间复杂度为 O(N),不符合题目要求。
②.深度优先搜索
由于 next 指针的存在,可以实现对二叉树进行从上往下从左到右的遍历,每个节点的 next 指针在遍历其父节点时进行赋值;当遍历到每一个节点时:把其左子节点和右子节点进行关联、右子节点和其下个节点的左子节点进行关联。
深度优先搜索
深度优先搜索(DFS)就是在每一步时对每一种可能的选择一条道走到底,然后再回过头尝试另外一种选择。
深度优先搜索的关键是要考虑“当前这一步”该如何做,至于“下一步”该怎么做和当前这一步的解决方法是一样的。在进行当前步的选择之前要确定已经做出的选择列表,然后在剩余可供选择的每一种可能进行遍历,对于每一种选择将选择结果以及选择状态代入下一步操作,然后再次进行深度优先搜索。
DFS 实现
DFS的实现考虑要以下几个问题即可:
①.边界范围:即搜索终止条件,递归结束条件。
②.可供选择的范围列表:所有可供选择的范围列表。
③. 已做出的选择列表:标记当前已经做出的选择。
DFS代码模板如下:
void dfs( int cur_step)
{
//判断边界
/********/
//尝试当前可供选择的每种可能
for(int i = 0;i < maxCount;i++)
{
//尝试每种选择
/******/
//选择结果代入下一步
dfs(cur_step+1);
//撤销当前选择,恢复状态
/*******/
}
}
代码示例
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node* next;
Node() : val(0), left(NULL), right(NULL), next(NULL) {}
Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}
Node(int _val, Node* _left, Node* _right, Node* _next)
: val(_val), left(_left), right(_right), next(_next) {}
};
*/
class Solution {
public:
Node* connect(Node* root) {
dfs(root,root);
return root;
}
void dfs(Node *curLeft,Node *curNode)
{
if( curLeft == NULL) return;//当前行为空
if( curNode == NULL)//当前节点为空
{
curLeft = curLeft->left;//转到下一行
curNode = curLeft;
}
if( curNode == NULL ) return;//遍历完了
//左子节点指向右子节点
if( curNode->left)
curNode->left->next = curNode->right;
//右子节点指向相邻节点左子节点
if( curNode->left && curNode->next)
curNode->right->next = curNode->next->left;
dfs(curLeft,curNode->next);//继续遍历下个节点
}
};