[关闭]
@zimenglan 2015-01-29T03:34:49.000000Z 字数 2010 阅读 1294

Binary Tree Level Order Traversal II

leetcode dfs bfs


原题链接


题意

Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root).

For example:
Given binary tree {3,9,20,#,#,15,7},
3
/ \
9 20
/ \
15 7
return its bottom-up level order traversal as:
[
[15,7],
[9,20],
[3]
]

解法

这道题和Binary Tree Level Order Traversal差不多的, 关键在于将最后的结果反转就可以了, 调用std::reverse函数即可, 具体看代码

code

  1. /**
  2. * Definition for binary tree
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  8. * };
  9. */
  10. class Solution {
  11. public:
  12. vector<vector<int> > levelOrderBottom(TreeNode *root) {
  13. vector<vector<int> > res;
  14. // Solution 1: dfs
  15. // const int level = 1;
  16. // dfs(root, level, res);
  17. // Solution 2: bfs
  18. bfs(root, res);
  19. // reverse
  20. std::reverse(res.begin(), res.end());
  21. return res;
  22. }
  23. // 每个节点所在的level刚好与其在res对应的vector的下标对应起来
  24. // 通过给每个node做标记, 该标记就是其在树中的level, dfs能很好完成标记任务
  25. // 在标记level的时候, 实例化对应的vector, 并将其加入到res中
  26. // 这样通过level来找到node对应的vector, 并将其值val加入到vector中
  27. // 递归以上操作
  28. void dfs(TreeNode* root, const int level, vector<vector<int> >& res) {
  29. if(root == NULL) return;
  30. if(level > res.size()) {
  31. // 实例化
  32. res.push_back(vector<int>());
  33. }
  34. res[level - 1].push_back(root->val);
  35. // 递归操作
  36. dfs(root->left, level + 1, res);
  37. dfs(root->right, level + 1, res);
  38. }
  39. // 其实这道题适合用bfs来弄, 因为比较直观
  40. // 不管dfs还是bfs, 关键在于找到标记信息, dfs中的标记信息为level,
  41. // bfs中的标记信息为NULL
  42. // 每次遇到NULL, 则更新res
  43. // 值得注意的时, 每次遇到标志信息时, 需要检查当前队列是否为空,
  44. // 否则会导致死循环
  45. void bfs(TreeNode* root, vector<vector<int> >& res) {
  46. if(root == NULL) return;
  47. // 这里可以用queue替代list, 需要注意的是, list和queue的函数名有点出入
  48. // queue<TreeNode*) que;
  49. list<TreeNode*> que;
  50. TreeNode* anno = NULL;
  51. vector<int> subRes;
  52. que.push_back(root);
  53. que.push_back(anno);
  54. while(!que.empty()) {
  55. const TreeNode* top = que.front();
  56. que.pop_front();
  57. // 如果top不等于标记节点anno, 则添加当前节点到subRes中
  58. if(top != anno) {
  59. subRes.push_back(top->val);
  60. // 如果top的左右孩子节点不为空, 则添加到队列中
  61. // 为了防止空孩子节点充当标记节点anno
  62. if(top->left != anno) que.push_back(top->left);
  63. if(top->right != anno) que.push_back(top->right);
  64. // top等于当前标记节点anno, 则将某个level的所有节点加入到res中
  65. // 也就是将subRes加入到res中
  66. } else {
  67. res.push_back(subRes);
  68. // 需要注意!!!
  69. // 需要判断当前是否为队列尾, 不为队列尾, 则添加标记节点anno
  70. // 否则会导致死循环
  71. if(!que.empty()) {
  72. // 将标记节点anno加入队列
  73. que.push_back(anno);
  74. // 清空subRes
  75. subRes.clear();
  76. }
  77. }
  78. }
  79. }
  80. };
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注