算法刷题03:从上往下打印二叉树

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;
    }
};
发布了57 篇原创文章 · 获赞 12 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_40938301/article/details/87188204