ps: 如果有任何问题可以评论留言,我看到后会及时解答,评论或关注,您的鼓励是我分享的最大动力
转载请注明出处:https://blog.csdn.net/qq_40938301/article/details/87188204
题目描述:
从上往下打印出二叉树的每个节点,同层节点从左至右打印(即广度优先遍历算法BFS)。
/*
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) {
}
};
算法思路:
由题目描述可知即对该二叉树进行层遍历:
eg:
1
/ \
2 3
/ \ / \
4 5 6 7
则输出顺序为 1 2 3 4 5 6 7
首先对单层二叉树进行分析,输出顺序为: 根节点 - 左子节点 - 右子节点
然后对多层二叉树进行分析,输出顺序为: 根节点 - 左子节点 - 右子节点 - 左子节点的左子节点 - 左子节点的右子节点 - 右子节 点的左子节点 - 右子节点的右子节点
要将单层二叉树的 根 - 左 - 右 的规律扩展到多层二叉树的话,即根 - 左 - 右,再对左节点 根 - 左 - 右,再对右节点 根 - 左 - 右
如此的话,左右节点会重复一次,因此可以 对根节点直接输出,而对左子节点和右子节点存放至数据结构中,再依次对左子节点和右子节点采取上面方法的循环。
而根据上面分析 数据结构 存放进去的时候顺序是左右,出来的时候也是左右,因此数据结构采用队列的方式。
而循环的实现,则要找到终止的条件,因为整个二叉树的节点已经转至队列的数据结构中了,因此终止条件在队列的数据结构中找,尝试常用的队列循环条件即非空则循环。
整体归纳:即先将根节点进队列,栈不空为循环条件,对队首进行 (出队、输出、左子节点进队、右子节点进队) 的循环;
对空节点则直接出队处理。
ps:这里的输出即将值 push_back( )进结果的vector中。
实现代码:
/*
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) {
queue<TreeNode*> q;
vector<int> res;
q.push(root);
while(!q.empty()){
root = q.front();
q.pop();
if(root!=NULL){
res.push_back(root->val);
q.push(root->left);
q.push(root->right);
}
}
return res;
}
};