Given the root
of a binary tree, return the bottom-up level order traversal of its nodes' values . (i.e., from left to right, level by level from leaf to root).
Example 1:
1 2 Input: root = [3,9,20,null,null,15,7] Output: [[15,7],[9,20],[3]]
Example 2:
1 2 Input: root = [1] Output: [[1]]
Example 3:
1 2 Input: root = [] Output: []
题目大意 给定一棵二叉树的根节点 root
,返回其节点值的自底向上的层序遍历 结果。即按「从叶子节点所在层到根节点所在层」的顺序逐层返回,每层内部仍保持「从左到右」的顺序。
例如:
输入二叉树 [3,9,20,null,null,15,7]
,其自底向上的层序遍历结果为 [[15,7],[9,20],[3]]
。
解题思路 自底向上的层序遍历可基于「常规层序遍历(自顶向下)」实现,核心思路是:
先按常规层序遍历(从根到叶子)收集每一层的节点值,得到 [[3],[9,20],[15,7]]
;
将收集到的结果反转 ,即可得到自底向上的层序遍历 [[15,7],[9,20],[3]]
。
代码实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 /** * 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>> result; if (root == nullptr) { return result; } queue<TreeNode*> q; q.push(root); // 常规层序遍历,从上到下收集节点值 while (!q.empty()) { int levelSize = q.size(); vector<int> currentLevel; for (int i = 0; i < levelSize; ++i) { TreeNode* node = q.front(); q.pop(); currentLevel.push_back(node->val); if (node->left != nullptr) { q.push(node->left); } if (node->right != nullptr) { q.push(node->right); } } result.push_back(currentLevel); } // 反转结果,得到从下到上的层序遍历 reverse(result.begin(), result.end()); return result; } };