给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

例如:
给定二叉树: [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回其层次遍历结果:

[
  [3],
  [9,20],
  [15,7]
]

来源:力扣(LeetCode)
链接: https://leetcode-cn.com/problems/binary-tree-level-order-traversal/

解题思路:

这个题比以前的层序遍历多了一步操作,那就是在输出的时候按照层序一层一层的输出。我们并不能简单的在打印上按照数字输出比如,第一层输出1个,第二层2个,第三层4个。而是要根据实际的每层有一个元素就输出什么。

回想层序遍历的方法是:将头结点和它的左右孩子节点全部入队,然后打印头节点,头节点出队,在这里我们可以将一个完整的二叉树看成单个的最小二叉树,所以头节点不单单指整个二叉树的头节点,而是每个最小二叉树的头节点。根据队列的特点,先入先出,就可以很好地完成层序遍历。

但是按层序输出是一个问题,可以想到,第一层 队列长度为1,第一层出队之后剩下的是下一层的所有元素,并且根据队列长度可以控制每一行输出的个数。

#include <iostream>
#include <queue>
#include <vector>
using namespace std;
class Solution {
	struct TreeNode {
		int val;
		TreeNode *left;
		TreeNode *right;
		TreeNode(int x) : val(x), left(NULL), right(NULL) 
		{}
		
	};
public:
	vector<vector<int>> levelOrder(TreeNode* root) 
	{
		vector<vector<int>> res;
		if (!root)
		{
			return res;
		}
		vector<int> vtmp;
		/* 层序遍历 ,先将头入队*/
		queue<TreeNode*> qu;
		TreeNode* cur=root;
		qu.push(root);
		int len = 1;
		/* 层序遍历 */
		while ( !qu.empty())
		{
			/* 控制压进vector的元素个数 */
			for (int i = 0; i < len; ++i)
			{
				cur = qu.front();
				vtmp.push_back(cur->val);
				qu.pop();
				if (cur->left)
				{
					qu.push(cur->left);
				}
				if (cur->right)
				{
					qu.push(cur->right);
				}
			}
			res.push_back(vtmp);
			vtmp.clear();
			len = qu.size();
		}
		return res;

	}
};
int main()
{
	
	system("pause"); 
	return 0;
}
发布了157 篇原创文章 · 获赞 98 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43447989/article/details/102511443