当前位置:   article > 正文

P6【力扣144,94,145】【数据结构】【二叉树遍历】C++版

P6【力扣144,94,145】【数据结构】【二叉树遍历】C++版

【144】二叉树的前序遍历

1、递归法:

  1. class Solution {
  2. public:
  3. void preorder(TreeNode* root, vector<int> &res){
  4. if(root == nullptr){
  5. return;
  6. }
  7. res.push_back(root->val);
  8. preorder(root->left, res);
  9. preorder(root->right, res);
  10. }
  11. vector<int> preorderTraversal(TreeNode* root) {
  12. vector<int> res;
  13. preorder(root, res);
  14. return res;
  15. }
  16. };

2、迭代法

 

  1. class Solution {
  2. public:
  3. vector<int> preorderTraversal(TreeNode* root) {
  4. vector<int> res;
  5. if(root == nullptr){
  6. return res;
  7. }
  8. stack<TreeNode*> stk;
  9. TreeNode* node = root;
  10. while(!stk.empty() || node != nullptr){
  11. while(node != nullptr){
  12. stk.push(node);
  13. res.push_back(node->val);
  14. node = node->left;
  15. }
  16. node = stk.top();
  17. stk.pop();
  18. node = node->right;
  19. }
  20. return res;
  21. }
  22. };

【94】二叉树的中序遍历

1、递归法

  1. class Solution {
  2. public:
  3. void postorder(TreeNode* root, vector<int>& res){
  4. if(root == nullptr){
  5. return;
  6. }
  7. postorder(root->left, res);
  8. res.push_back(root->val);
  9. postorder(root->right, res);
  10. }
  11. vector<int> inorderTraversal(TreeNode* root) {
  12. vector<int> res;
  13. postorder(root, res);
  14. return res;
  15. }
  16. };

2、迭代法 

  1. class Solution {
  2. public:
  3. vector<int> inorderTraversal(TreeNode* root) {
  4. vector<int> res;
  5. if(root == nullptr){
  6. return res;
  7. }
  8. stack<TreeNode*> stk;
  9. TreeNode* node = root;
  10. while(!stk.empty() || node != nullptr){
  11. while(node != nullptr){
  12. stk.push(node);
  13. node = node->left;
  14. }
  15. node = stk.top();
  16. res.push_back(node->val);
  17. stk.pop();
  18. node = node->right;
  19. }
  20. return res;
  21. }
  22. };

复杂度分析:

时间复杂度:O(N)每个结点会遍历一次且只遍历一次 

空间复杂度:O(N)栈至多会存放所有树节点

【145】二叉树的后序遍历

1、递归法

  1. class Solution {
  2. public:
  3. void postorder(TreeNode* root, vector<int>& res){
  4. if(root == nullptr){
  5. return;
  6. }
  7. postorder(root->left, res);
  8. postorder(root->right, res);
  9. res.push_back(root->val);
  10. }
  11. vector<int> postorderTraversal(TreeNode* root) {
  12. vector<int> res;
  13. postorder(root, res);
  14. return res;
  15. }
  16. };

2、迭代法 

  1. class Solution {
  2. public:
  3. vector<int> postorderTraversal(TreeNode* root) {
  4. vector<int> res;
  5. if(root == nullptr){
  6. return res;
  7. }
  8. stack<TreeNode*> stk;
  9. TreeNode * prev = nullptr;
  10. while(!stk.empty() || root != nullptr){
  11. while(root != nullptr){
  12. stk.push(root);
  13. root = root->left;
  14. }
  15. root = stk.top();
  16. stk.pop();
  17. if(root->right == nullptr || root->right == prev){
  18. res.push_back(root->val);
  19. prev = root;
  20. root = nullptr;
  21. }else{
  22. stk.push(root);
  23. root = root->right;
  24. }
  25. }
  26. return res;
  27. }
  28. };

思路:

根节点开始遍历,并将根节点入栈,再遍历他的左子树,并依次入栈,直到该结点没有左子树。判断这个结点是否有右子树,如果没有,则将该结点弹出栈,并记录结点值。如果有则继续从他的右子树进行遍历,同时记录该结点的右子树是否遍历过,如果遍历过,则弹栈并记录结点值。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/618475
推荐阅读
相关标签
  

闽ICP备14008679号