题目:
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
思路:广度优先搜索
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
vector<int> PrintFromTopToBottom(TreeNode* root) {
vector<int> v;
queue<TreeNode*> q;
q.push(root);
if(root==NULL) return {};
while(!q.empty())
{
v.push_back(q.front()->val);
if(q.front()->left!=NULL)
q.push(q.front()->left);
if(q.front()->right!=NULL)
q.push(q.front()->right);
q.pop();
}
return v;
}
};
小见:
对二叉树相关问题掌握的向来都不太好,看了下评论区的答案提到了广度优先搜索,查了一下广度优先搜索和深度优先搜索。
首先,本题中使用的广度优先搜索思想,是指,借助队列按层存储节点,然后只要按顺序打印就好了。
具体过程如下:
1、准备:创建一个节点型(需要搜索的节点的类型)队列,用来存放每一层的顶点;
创建一个int型数组,用来记录被访问过的顶点(此处存放该顶点的值);
2、从某个节点(根节点)开始访问,将这个节点的值设为true,同时入队;
3、只要队列不空,重复如下操作:
(1)队头顶点出队;
(2)依次检查该顶点的所有邻接节点(左右子树),如果值为falsh,则访问、置为true并入队,反之不访问;
备注:在二叉树中不存在重复访问的情况,即不存在多对一的情况,所以这一步不需要;而用来记录访问节点的数组在本题中可以作为存放各顶点的值(它的使用顺序与节点入队顺序一致);
关于广度优先搜索与深度优先搜索的相关知识整理如下:
https://www.cnblogs.com/skywang12345/p/3711483.html
https://blog.csdn.net/weixin_40953222/article/details/80544928
广度借助队列,深度借助栈