LeetCode二叉树层序遍历II

LeetCode二叉树层序遍历II

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kJJmSQlM-1668672521121)(https://s1.ax1x.com/2022/11/17/zmiSHK.jpg)]

  • 层序遍历II相当于在层序遍历I的基础上加一个std::reverse()函数即可,相当于复习前一天的recursion方法以及iteration方法

  • 具体的题目思路分析和解法见上一篇文章:LeetCode二叉树层序遍历I

一、二叉树层序遍历II递归法(代码)
#include
#include
#include
using namespace std;

struct TreeNode {
	TreeNode* left;
	TreeNode* right;
	int val;
	TreeNode(int x) :val(x), left(nullptr), right(nullptr) {};
};

class Binary_Tree_Level_Order_Traversal_II_Recursion {
	vector>  levelOrderBottom(TreeNode* root) {
		vector> result;
		traversal(root,1,result);
		reverse(result.begin(), result.end()); // 比Level_OrderI多一行reverse操作
		return result;
	}

	void traversal(TreeNode* root, int level, vector>& result) {
		if (!root) {
			return;
		}
		if (level > result.size()) {
			result.push_back(vector());
		}
		result[level - 1].push_back(root->val);
		traversal(root->left, level + 1, result);
		traversal(root->right, level + 1, result);
	}
};
二、二叉树层序遍历II迭代法(代码)
#include
#include
#include
using namespace std;

struct TreeNode {
	TreeNode* left;
	TreeNode* right;
	int val;
	TreeNode(int x) :val(x), left(nullptr), right(nullptr) {};
};

class Binary_Tree_Level_Order_Traversal_II_Iteration {
	vector> levelOrderBottom(TreeNode* root) {
		vector> result;
		traversal(root,1,result);
		reverse(result.begin(), result.end());
		return result;
	}

	void traversal(TreeNode* root, int level, vector>& result) {
		if (!root)return;
		queue current, next;
		current.push(root);
		while (!current.empty()) {
			vector level;
			while (!current.empty()) {
				TreeNode* p;
				p = current.front();
				current.pop();
				level.push_back(p->val);
				if (p->left != nullptr)next.push(p->left);
				if (p->right != nullptr)next.push(p->right);
			}
			result.push_back(level);
			swap(current, next);
		}
	}
};

你可能感兴趣的:(数据结构与算法,leetcode,算法,c++)