一、题目
1、题目描述
给你二叉树的根节点 root
,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
示例1:
输入:root = [3,9,20,null,null,15,7]
输出:[[15,7],[9,20],[3]]
示例2:
输入:root = [1]
输出:[[1]]
示例3:
输入:root = []
输出:[]
2、基础框架
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
}
};
3、原题链接
二、解题报告
1、思路分析
(1)将根节点放入队列中,然后计算此时队列的size,(2)步骤执行size次 【size就是每层的节点个数】
(2)弹出队列中的节点,如果有左孩子就添加左孩子到队列中,再如果有右孩子,就添加到右孩子中;
(3)将每层的结果保存起来,最后将所有结果放到一个大的容器中。题目给定的是vector,因为是顺序放入vector中的,所有需要在最后将首尾成对的元素进行交换;
(4) 如果使用的容器是 list<list<int>>
,则可以将每层的结果直接插入到结果的头部(头插法),会更加省时
2、时间复杂度
O ( n ) O(n) O(n)
3、代码详解
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> ans;
if (root == nullptr) return ans;
queue<TreeNode*> que;
que.push(root);
while (!que.empty()) {
int size = que.size(); //记录当前层的节点个数
vector<int> curAns;
for (int i = 0; i < size; i++) {
TreeNode *curNode = que.front();
que.pop();
curAns.push_back(curNode->val);
if (curNode->left != nullptr) {
que.push(curNode->left);
}
if (curNode->right != nullptr) {
que.push(curNode->right);
}
}
ans.push_back(curAns);
}
//ans里面是放着从上到下每一层的节点
//结果需要倒过来,将vector中的元素首尾成对进行交换
int l = 0;
int r = ans.size() - 1;
while (l < r) {
vector<int> tmp = ans[l];
ans[l] = ans[r];
ans[r] = tmp;
l++;
r--;
}
return ans;
}
};
使用List 容器保存结果的Java代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> ans = new LinkedList<>();
if (root == null) return ans;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
int size = queue.size();
List<Integer> curAns = new LinkedList<>();
for (int i = 0; i < size; i++) {
TreeNode curNode = queue.poll();
curAns.add(curNode.val);
if (curNode.left != null) {
queue.add(curNode.left);
}
if (curNode.right != null) {
queue.add(curNode.right);
}
}
ans.add(0, curAns); //在头插入,结果就是自底向上的层序遍历结果
}
return ans;
}
}