【每日一题】层序遍历(自顶向下AND自底向上)

前面的文章中我有实现过二叉树的简单函数实现,在这就不详细介绍了,不了解的请戳https://blog.csdn.net/dove1202ly/article/details/79133089

今天主要讲【层序遍历】---->面试常考点,必须会哦^ _ ^

【题目】给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

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

    3
   / \
  9  20
    /  \
   15   7

返回其自顶向下的层次遍历为:

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

返回其自底向上的层次遍历为:

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

【代码实现】

#include
using namespace std;
#include
#include
#include
 struct TreeNode {
     int val;
     TreeNode *left;
     TreeNode *right;
     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 };
 //自顶向下
 //class Solution {
 //public:
	// vector> levelOrder(TreeNode* root) {
	//	 vector> result;//用来保存结果;默认初始化,result不含任何元素
	//	 if (NULL == root)
	//	 {
	//		 return result;
	//	 }
	//	 //用队列保存数据---》先进先出
	//	 queue qu;
	//	 qu.push(root);//先将根压进去;
	//	 while (!qu.empty())
	//	 {
	//		 vector tmp;//保存每层的结点值
	//		 int sz = qu.size();
	//		 while (sz--)
	//		 {
	//			 //先保存队头结点
	//			 TreeNode* topnode = qu.front();
	//			 qu.pop();
	//			 tmp.push_back(topnode->val);
	//			 if (topnode->left)
	//			 {
	//				 qu.push(topnode->left);
	//			 }
	//			 if (topnode->right)
	//			 {
	//				 qu.push(topnode->right);
	//			 }
	//		 }
	//		 result.push_back(tmp);
	//	 }
	//	 return result;
	// }
 //};
 //自底向上
class Solution {
public:
	vector> levelOrder(TreeNode* root) {
		vector> result;
		if (NULL == root)
		{
			return result;
		}
		queue qu;
		qu.push(root);
		while (!qu.empty())
		{
			vector tmp;
			int sz = qu.size();
			while (sz--)
			{
				//先保存队头结点
				TreeNode* topnode = qu.front();
				qu.pop();
				tmp.push_back(topnode->val);
				if (topnode->left)
				{
					qu.push(topnode->left);
				}
				if (topnode->right)
				{
					qu.push(topnode->right);
				}
			}
			result.push_back(tmp);
		}
		//这时候是按从上往下的顺序访问的,逆转之后就是自底向上
		reverse(result.begin(), result.end());
		return result;
	}
};

 

你可能感兴趣的:(刷题)