• 二叉树的前序、中序和后序非递归


    目录

    一、前序

    二、中序

    三、后序


    一、前序

    力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 

     

    1. /**
    2. * Definition for a binary tree node.
    3. * struct TreeNode {
    4. * int val;
    5. * TreeNode *left;
    6. * TreeNode *right;
    7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
    8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
    10. * };
    11. */
    12. class Solution {
    13. public:
    14. vector<int> preorderTraversal(TreeNode* root) {
    15. vector<int> v;
    16. stack s;
    17. TreeNode*cur = root;
    18. while(cur!=nullptr || !s.empty())
    19. //cur为空表示结点为空,栈为不为空表示还有右子树没访问
    20. {
    21. //访问一棵树的开始
    22. //1. 访问左路结点,左路结点入栈
    23. while(cur!=nullptr)
    24. {
    25. v.push_back(cur->val);
    26. s.push(cur);
    27. cur = cur->left;
    28. }
    29. //依次访问左路结点的右子树
    30. TreeNode*tmp = s.top();
    31. s.pop();
    32. cur = tmp->right;
    33. }
    34. return v;
    35. }
    36. };

    二、中序

    力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

     

    1. /**
    2. * Definition for a binary tree node.
    3. * struct TreeNode {
    4. * int val;
    5. * TreeNode *left;
    6. * TreeNode *right;
    7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
    8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
    10. * };
    11. */
    12. class Solution {
    13. public:
    14. vector<int> inorderTraversal(TreeNode* root) {
    15. stacks;//栈中存放待访问的结点
    16. vector<int>v;
    17. TreeNode*cur = root;
    18. while(cur!=nullptr || !s.empty())
    19. {
    20. while(cur!=nullptr)//while循环是将左路结点进行了入栈
    21. {
    22. s.push(cur);
    23. cur = cur->left;
    24. }
    25. TreeNode*tmp = s.top();//从栈中开始取数据,代表左子树已经访问完了
    26. s.pop();
    27. v.push_back(tmp->val);//先访问根
    28. cur = tmp->right;//去到右子树
    29. }
    30. return v;
    31. }
    32. };

    三、后序

     

    1. /**
    2. * Definition for a binary tree node.
    3. * struct TreeNode {
    4. * int val;
    5. * TreeNode *left;
    6. * TreeNode *right;
    7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
    8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
    10. * };
    11. */
    12. class Solution {
    13. public:
    14. vector<int> postorderTraversal(TreeNode* root) {
    15. stack s;
    16. vector<int> v;
    17. TreeNode* cur = root;
    18. TreeNode* prev = nullptr;//prev记录上一个访问的结点
    19. while(cur!=nullptr || !s.empty())
    20. {
    21. while(cur!=nullptr)
    22. {
    23. s.push(cur);
    24. cur = cur->left;
    25. }
    26. TreeNode* tmp = s.top();
    27. if(tmp->right == nullptr || tmp->right == prev)
    28. //如果tmp的右为空或者上一个访问的是tmp的右,此时就可以访问tmp
    29. {
    30. v.push_back(tmp->val);
    31. s.pop();
    32. prev = tmp;//更新tmp
    33. }
    34. else//tmp结点的右没有访问过,此时先访问tmp的右
    35. {
    36. cur = tmp->right;
    37. }
    38. }
    39. return v;
    40. }
    41. };

  • 相关阅读:
    【python自动化】01.安装配置库和环境之win32gui安装失败(保姆级图文)
    JSP开发环境搭建(Tomcat的安装和配置)
    从资源隔离、资源配额、存储、网络四个方面认识Docker
    c++学习记录(一)
    WebAssembly — 概览
    【题解】42. 接雨水(动态规划 预处理)
    【21天Python进阶学习挑战赛】[day3]json标准库大总结
    校园论坛(Java)—— 登录注册和用户信息模块
    基于Dockerfile创建镜像
    redis哨兵练习
  • 原文地址:https://blog.csdn.net/m0_63783532/article/details/134093487