LeetCode102,107. 二叉树层次遍历/自底向上遍历--递归和非递归实现

LeetCode102,107. 二叉树层次遍历/自底向上遍历--递归和非递归实现

    • code

code

// 二叉树的层序遍历,leetcode 102
// 层序遍历--递归实现(核心是需要 二维数组和变量level)
// Definition for a binary tree node.
struct TreeNode
{
	int val;
	TreeNode* left;
	TreeNode* right;
};
class Solution {
public:
	vector<vector<int>> levelOrder(TreeNode* root) {
		if(!root) return{};
		vector<vector<int>> res;
		levelorder(root,0,res);
		return res;
		// return vector> (res.rbegin(),res.rend()); //修改上面那句代码,使用反向迭代器,使得最终变成自底向上
	}
	void levelorder(TreeNode* node, int level, vector<vector<int>>& res) {
		if(!node) return;
		if(res.size() == level)	res.push_back({});
		res[level].push_back(node->val);
		if(node->left) levelorder(node->left,level+1,res);
		if(node->right) levelorder(node->right,level+1,res);
	}
}
// 二叉树的层序遍历,非递归实现
// 层序遍历是 广度优先遍历搜索BFS 的应用,需要利用二维向量,并建立 队列 queue 来存放数据。
class Solution {
public:
	vector<vector<int>> levelOrder(TreeNode* root) {
		if(!root) return{};
		vector<vector<int>> res;
		queue<TreeNode*> q{ {root} };  //先将根节点放进去
		// 判断的也是队列是否为空
		while (!q.empty())
		{
			vector<int> oneOfLevel;
			for (int i = q.size(); i > 0; i--)  //注意层次遍历需要将每一层的节点遍历完
			{
				// 对每一层进行扫描
				TreeNode *t = q.front();q.pop();
				oneOfLevel.push_back(t->val);
				if(t->left) q.push(t->left);
				if(t->right) q.push(t->right;
			}
			res.push_back(oneOfLevel);
			//res.insert(res.begin(),oneOfLevel); //使用这种方式存储就是从下往上遍历
		}
		
	}
}

// 二叉树的层次遍历2, leetcode 107, 从底层向上遍历,其实核心算法和前面从上向下是一样的,只是最后存储的方式改变了。

你可能感兴趣的:(LeetCode)