持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
一、题目
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
vector<vector<int> > leverOrder(TreeNode* root){
}
int main(int, char**)
{
TreeNode root(3);
TreeNode node1(9);
TreeNode node2(20);
TreeNode node3(15);
TreeNode node4(7);
root.left = &node1;
root.right = &node2;
node2.left = &node3;
node2.right = &node4;
vector<vector<int> > res = leverOrder(&root);
for(vector<int>& datas : res){
for(int& data : datas){
cout << data << ' ';
}
cout << endl;
}
return 0;
}
二、分析
根据题意可知,这是一道经典的层序遍历题。
层序遍历的难点在于二叉树结构本身决定了节点不能横向指向,
只能通过父节点索引左右节点,在这种情况下应该怎么去遍历呢?
通过二叉树的特性,很容易想到,第二层是第一层的子节点,第三层是所有第二层的子节点,这个条件下,我们只需要每次都保存当前层的所有子节点就可以实现层序遍历。
三、模拟
1.
层数:1
当前值: 3
保存子节点: 9,20
2.
层数:2
当前值: 9,20
保存子节点: 15,7
3.
层数:3
当前值: 15,7
保存子节点: 空
- 遍历结束
四、实现
vector<vector<int> > leverOrder(TreeNode* root){
vector<vector<int> > res;
if(!root) return res;
queue<TreeNode*> que;
que.push(root);
TreeNode* cursor;
while(!que.empty()){
vector<int> rres;
size_t count = que.size() + 1;
while(--count){
cursor = que.front();
que.pop();
rres.push_back(cursor->val);
if(cursor->left) que.push(cursor->left);
if(cursor->right) que.push(cursor->right);
}
res.push_back(rres);
}
return res;
}
五、结言
经典的层序遍历算法是每个程序员都应该熟练掌握的经典算法之一,在平时的工作中,这些基本算法就是基石,通过对经典算法的变种可以解决很多问题。
比如解决判断是否是完全二叉树的问题时,就能很好的决绝问题。
创作不易,留个赞再走吧!如果对文章内容有任何指正,欢迎评论!