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