[Lc]102二叉树的层次遍历
Contents
题解
题解
二叉树结构如下:
//Definition for a binary tree node.
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
1. 队列迭代法
class Solution {//两种方法。1、队列迭代法。
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
if(!root) return res;
//定义保存结果的二维数组,root为空直接返回空数组
queue<TreeNode*> q;
q.push(root);//定义队列q并暂存根节点的值
while(!q.empty()){//当q不为空时继续循环迭代
vector<int> thisLevel;//定义保存当前层次值的一维数组
//for(int i=0;i<q.size();i--){
//注意这里不能这么写,因为q是动态的,会随着循环进行改变判断条件。但是赋值语句for循环只执行一次,不会改变。
for(int i=q.size(); i>0; i--){//对这一层已经压入队列的数进行遍历
TreeNode *cur = q.front();q.pop();//取队首的值,并出队列
thisLevel.push_back(cur->val);//压入一维数组
if(cur->left) q.push(cur->left);//当左子节点存在,压入队尾
if(cur->right) q.push(cur->right);//右子节点同上
}
res.push_back(thisLevel);//一个层次存完压入res中
}
return res;//返回结果
}
};
2. 递归法
class Solution {//两种方法。2、递归法。其实是深度优先搜索,但是引入一个level用于存储当前在第几层。
vector<vector<int>> res;//定义存结果的二维数组res
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if(!root) return res;//特殊情况的判断
helper(root,0);//进入递归函数
return res;//返回结果
}
void helper(TreeNode* cur, int level){//定义递归函数
if(!cur) return;//若当前节点为空,直接返回
if(res.size() == level) res.push_back({});//当res.size()==level时创建新行。因为level从0开始计数,当二者相等时实际递归到的层数已经大于res.size(),需要添加一行。
res[level].push_back(cur->val);//为该level添加新的值
helper(cur->left,level+1);//递归左子树
helper(cur->right,level+1);//递归右子树
}
};
Author ChrisHRZ
LastMod 2020-03-15