leetcode上做的一道题,逆序层次遍历,题目限制要保存成vector<vector<int>>的格式,加注释防止自己忘记思路。
题目描述
给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其自底向上的层序遍历为:
[
[15,7],
[9,20],
[3]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
输入:
[3,9,20,null,null,15,7]
输出:
[[15,7],[9,20],[3]]
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> lev;//存整棵树的节点值,lev[i][j]对应树中第i行第j个元素(从0开始)
if(root!=NULL){
vector<int> l;//存一层的节点值
queue<TreeNode*> q;
q.push(root);
l.push_back(root->val);//预处理根节点,因为只有一个值,直接打包进l再打包进lev
lev.push_back(l);
l.clear();
int h=0;//记录层高
int w1=1;//记录正在遍历的层的结点中的还在队列里的结点数
int w2=0;//记录下一层的结点数
while(!q.empty()){
TreeNode *tn=q.front();
q.pop();
w1-=1;
if(tn->left!=NULL){
q.push(tn->left);
w2+=1;
l.push_back(tn->left->val);//把子结点的值扔进l
}
if(tn->right!=NULL){
q.push(tn->right);
w2+=1;
l.push_back(tn->right->val);
}
if(w1==0){//当前层的结点已经全部出队
//这里其实多存了一层空节点的值,可以多加一个判断,如果q空则不进行下面这些操作。
lev.push_back(l);//此时l中记录了下一层的所有结点的值,打包扔进lev
l.clear();//清空l
w1=w2;//下移一层进行遍历
w2=0;
h+=1;
}
}
vector<vector<int>> lev_rev;//lev中为顺序,而题目要求逆序输出
for(int i=h-1;i>=0;i--){
lev_rev.push_back(lev[i]);//lev[i]对应原来树中第i层的从左到右的值序列
}
return lev_rev;
}
return lev;//若树为空树则输出空的lev
}