当前位置:   article > 正文

LeetCode 144.二叉树的前序遍历 (C++)_力扣二叉树的前序遍历c++

力扣二叉树的前序遍历c++

题目地址:力扣

二叉树的前序遍历就是,根 -> 左 -> 右,这样的次序。

解法1:递归,这个模板是前中后通用的

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

解法2:迭代(手动建栈模拟系统操作)

  1. class Solution {
  2. public:
  3. vector<int> preorderTraversal(TreeNode* root) {
  4. vector<int> res;
  5. stack<TreeNode*> stk;
  6. while (root != nullptr || !stk.empty())
  7. {
  8. while (root != nullptr)
  9. {
  10. res.push_back(root->val);
  11. stk.push(root);
  12. root = root->left;
  13. }
  14. // 保证从栈里面出来的都是只有右孩子没探索过的
  15. root = stk.top();
  16. stk.pop();
  17. root = root->right;
  18. }
  19. return res;
  20. }
  21. };

解法3:Morris遍历

思想还是向左遍历之前,让当前节点左子树的最右节点指向自己,这样回溯的时候就能找到。

  1. class Solution {
  2. public:
  3. vector<int> preorderTraversal(TreeNode *root) {
  4. vector<int> res;
  5. TreeNode *p1 = root, *p2 = nullptr;
  6. // p2的设定是p1的左孩子
  7. // p1非空就继续循环
  8. while (p1 != nullptr) {
  9. p2 = p1->left;
  10. // 若p1有左孩子
  11. if (p2 != nullptr) {
  12. // p2是p1左子树的最右节点
  13. while (p2->right != nullptr && p2->right != p1) {
  14. p2 = p2->right;
  15. }
  16. // p2->right == nullptr 确定了该节点是第一次访问
  17. // 先把p1加入结果,再把p1左子树的最右节点指向p1,p1继续往左走
  18. if (p2->right == nullptr) {
  19. res.push_back(p1->val);
  20. p2->right = p1;
  21. p1 = p1->left;
  22. continue;
  23. // // p2->right == p1 说明该节点已经访问过,此时再访问到就置为空
  24. } else {
  25. p2->right = nullptr;
  26. }
  27. } // 若p1无左孩子,则把p1加入结果
  28. else {
  29. res.push_back(p1->val);
  30. }
  31. //
  32. // 1、其左孩子已经访问完毕,因此把p1的右孩子赋给p1
  33. // 要么就是在回溯的路上,要么就是到了一个全新的未被访问过的节点
  34. p1 = p1->right;
  35. }
  36. return res;
  37. }
  38. };

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

闽ICP备14008679号