LeetCode刷题笔记(树):binary-tree-postorder-traversal

怼烎@ 2022-05-31 04:29 286阅读 0赞

  • 转载请注明作者和出处:http://blog.csdn.net/u011475210
  • 代码地址:https://github.com/WordZzzz/Note/tree/master/LeetCode
  • 刷题平台:https://www.nowcoder.com/ta/leetcode
  • 题  库:Leetcode经典编程题
  • 编  者:WordZzzz

    • 题目描述
    • 解题思路
    • C版代码实现

      • 递归
      • 迭代

题目描述

Given a binary tree, return the postorder traversal of its nodes’ values.

For example:
Given binary tree{1,#,2,3},

1
\
2
/
3

return[3,2,1].

Note: Recursive solution is trivial, could you do it iteratively?

给定一个二叉树,返回其节点值的后序遍历。

注意:递归解决方案是微不足道的,你可以迭代地做?

解题思路

两种方法,递归和迭代,递归太简单了,直接贴出代码就不多说了。

后序遍历的非递归版可以说是三种遍历中最难的了,因为要先穷举左右结点,最后才是根结点。在外循环中,第一步还是依次将左子树入栈;然后看栈顶元素,如果栈顶元素没有右孩子,或者右孩子时候已经遍历过,那么就弹出栈顶元素,并记录;否则,遍历右子树。

C++版代码实现

递归

  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. void postorder(TreeNode *root, vector<int> &res){
  13. if(root){
  14. postorder(root->left, res);
  15. postorder(root->right, res);
  16. res.push_back(root->val);
  17. }
  18. }
  19. vector<int> postorderTraversal(TreeNode *root) {
  20. vector<int> res;
  21. postorder(root, res);
  22. return res;
  23. }
  24. };

迭代

  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<int> postorderTraversal(TreeNode *root) {
  13. vector<int> res;
  14. stack<TreeNode *> sta;
  15. TreeNode *cur = root, *last = NULL;
  16. while(cur != NULL || !sta.empty()){
  17. while(cur != NULL){
  18. sta.push(cur);
  19. cur = cur->left;
  20. }
  21. cur = sta.top();
  22. if(cur->right == NULL || cur->right == last){
  23. sta.pop();
  24. res.push_back(cur->val);
  25. last = cur;
  26. cur = NULL;
  27. }else
  28. cur = cur->right;
  29. }
  30. return res;
  31. }
  32. };

系列教程持续发布中,欢迎订阅、关注、收藏、评论、点赞哦~~( ̄▽ ̄~)~

完的汪(∪。∪)。。。zzz

发表评论

表情:
评论列表 (有 0 条评论,286人围观)

还没有评论,来说两句吧...

相关阅读

    相关 LeetCode笔记

    [23. Merge k Sorted Lists][] > 要点: > > 1. 学会数据结构PriorityQueue(优先队列)的用法, 通过给优先队列传入自定义