root结点是否为空(if(!root)):如果为空,则直接返回(整个递归的出口)result的大小与level的大小关系(判定有没有属于自己这一层的网格)
result.push_back(vector()); result[level-1].push_back(p->val);Traversal(root->left, level + 1, result);Traversal(root->right, level + 1, result);代码如下:
#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_recursion {
vector>LevelOrder(TreeNode* root) {
vector> result;
Traversal(root, 1, result);
return result;
}
void Traversal(TreeNode* root, int level, vector>& result) {
if (!root) return; // 如果root指针为空(0)则返回,函数退出
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);
}
};
queue current, next; root存入current队列之中current队列不为空,进入第1个while循环:while (!current.empty())
vector Level; while (!current.empty()),循环内操作与前序遍历很类似
current.pop()level.push_back(p->val);next队列中,用来下一次的遍历
if (p->left) next.push(p->left);if (p->right) next.push(p->right);level的值存进result中current的内容与next队列互换即可准备下一层的遍历操作代码如下:
#include
#include
#include
using namespace std;
class Binary_Tree_Level_Order_Traversal_iteration {
vector> LevelOrder(TreeNode* root) {
vector> result;
Traversal(root, 1, result);
return result;
}
void Traversal(TreeNode* root, int level, vector>& result) {
queue current, next;
current.push(root);
if (!root) return;
while (!current.empty()) {
vector Level;
while (!current.empty()) {
TreeNode* p = current.front();
current.pop();
Level.push_back(p->val);
if (p->left) next.push(p->left);
if (p->right) next.push(p->right);
}
result.push_back(Level);
swap(current, next);
}
}
};