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);}}
};