Binary Tree Level Order Traversal

来源:互联网 发布:java疯狂讲义版本 编辑:程序博客网 时间:2024/06/15 16:00

Binary Tree Level Order Traversal

leetcode dfs bfs


Binary Tree Level Order Traversal

题目链接


reference

题目大意:

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},


/ \ 
9 20 
/ \ 
15 7 
return its bottom-up level order traversal as:


[15,7], 
[9,20], 
[3] 
]

解题思路:

可以用dfs或者bfs来求解, 关键在于利用标记信息来区分树中的每一层, 详见代码

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