搜索或者遍历主要涉及以下三点内容
-
每个节点都要访问一次
-
每个节点仅仅访问一次
-
对于节点的访问顺序不同可以分为
- 广度优先遍历
- 深度优先遍历(Depth-First-Search)
深度优先遍历(DFS)
> 1
> / \
> 2 5
> / \
> 3 4
(以上为执行顺序)
void DFS(TreeNode* root)
{
if(root==nullptr)
return;
cout<<root->val<<" ";
DFS(root->left);
DFS(root->right);
}
深度遍历可以用迭代和辅助栈的方式来实现。
广度优先遍历(BFS)
> 1
> / \
> 2 3
> / \
> 4 5
(以上为执行顺序)
广度遍历就好比水滴,是层层深入,像水波一样向外扩散. 广度遍历一般使用队列的方式来实现
例题
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],
返回其层次遍历结果:
解法一(BFS)
vector<vector<int>> levelOrder(TreeNode* root) {
if(root==nullptr)
return {};
queue<TreeNode*> _queue;
vector<vector<int>> result;
_queue.push(root);
while (!_queue.empty()) {
vector<int> temp;
//通过当前队列的长度来判断右多少个值
int length = _queue.size();
for(int i=0;i<length;i++)
{
TreeNode* node = _queue.front();
_queue.pop();
temp.push_back(node->val);
if(node->left) _queue.push(node->left);
if(node->right) _queue.push(node->right);
}
result.push_back(temp);
}
return result;
}
解放二(DFS)
利用迭代来实现,其中最为关键的就是level
//层数level,tree root,contain result
void recursive(int level,TreeNode* root,vector<vector<int>> &result)
{
//terminator
if(root==nullptr)
return;
if(result.size() == level) result.resize(level+1);
result[level].push_back(root->val);
recursive(level+1,root->left,result);
recursive(level+1,root->right,result);
}
//dfs来完成
vector<vector<int>> levelOrder(TreeNode* root){
if(root==nullptr)
return {};
vector<vector<int>> result;
recursive(1,root,result);
return result;
}