当前位置:   article > 正文

二叉树的先序遍历、中序遍历、后序遍历、层次遍历_二叉树的前序遍历与层次遍历相同时满足条件

二叉树的前序遍历与层次遍历相同时满足条件

本篇博客介绍二叉树的先序遍历、中序遍历、后序遍历以及层次遍历

先序遍历:根节点---左子树---右子树

中序遍历:左子树---根节点---右子树

后序遍历:左子树---右子树---根节点

层次遍历:每一层按照从左到右依次遍历

先序遍历结果:1 2 4 5 7 8 3 6

中序遍历结果:4 2 7 5 8 1 3 6

后序遍历结果:4 7 8 5 2 6 3 1

层次遍历结果:1 2 3 4 5 6 7 8

 

先序遍历

首先,先序遍历的递归代码:

  1. vector<int> arr;
  2. vector<int> preorderTraversal(TreeNode* root)
  3. {
  4. if(root == NULL)
  5. {
  6. return arr;
  7. }
  8. arr.push_back(root->val);
  9. preorderTraversal(root->left);
  10. preorderTraversal(root->right);
  11. return arr;
  12. }

 C++迭代的方式实现先序遍历:

  1. vector<int> preorderTraversal(TreeNode* root)
  2. {
  3. vector<int> arr;
  4. if(root == NULL)
  5. {
  6. return arr;
  7. }
  8. stack<TreeNode*> st;
  9. st.push(root);
  10. while(!st.empty())
  11. {
  12. root = st.top(); st.pop();
  13. arr.push_back(root->val);
  14. if(root->right != NULL)
  15. {
  16. st.push(root->right);
  17. }
  18. if(root->left != NULL)
  19. {
  20. st.push(root->left);
  21. }
  22. }
  23. return arr;
  24. }

中序遍历

中序遍历的递归代码:

  1. vector<int> arr;
  2. vector<int> inorderTraversal(TreeNode* root) {
  3. if(root == NULL)
  4. {
  5. return arr;
  6. }
  7. inorderTraversal(root->left);
  8. arr.push_back(root->val);
  9. inorderTraversal(root->right);
  10. return arr;
  11. }

C++迭代的方式实现中序遍历:

  1. vector<int> inorderTraversal(TreeNode* root) {
  2. vector<int> arr;
  3. stack<TreeNode*> st;
  4. while(root != NULL || !st.empty())
  5. {
  6. if(root != NULL)
  7. {
  8. st.push(root);
  9. root = root->left;
  10. }
  11. else
  12. {
  13. root = st.top(); st.pop();
  14. arr.push_back(root->val);
  15. root = root->right;
  16. }
  17. }
  18. return arr;
  19. }

后序遍历

C++递归的方式实现后序遍历:

  1. vector<int> arr;
  2. vector<int> postorderTraversal(TreeNode* root) {
  3. if(root == NULL)
  4. {
  5. return arr;
  6. }
  7. postorderTraversal(root->left);
  8. postorderTraversal(root->right);
  9. arr.push_back(root->val);
  10. return arr;
  11. }

C++迭代的方式实现后序遍历:

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

层次遍历

C++迭代的方式实现层次遍历:

  1. vector<vector<int>> levelOrder(TreeNode* root) {
  2. queue<TreeNode*> qu;
  3. vector<vector<int>> vec;
  4. qu.push(root);
  5. int depth = 0;
  6. while(!qu.empty())
  7. {
  8. vector<int> arr;
  9. int count = qu.size();
  10. while(count > 0)
  11. {
  12. TreeNode* pNode = qu.front(); qu.pop();
  13. if(pNode!=NULL)
  14. arr.push_back(pNode->val);
  15. if((pNode != NULL) && (pNode->left != NULL))
  16. {
  17. qu.push(pNode->left);
  18. }
  19. if((pNode != NULL) && (pNode->right != NULL))
  20. {
  21. qu.push(pNode->right);
  22. }
  23. count--;
  24. }
  25. if(root!=NULL)
  26. vec.push_back(arr);
  27. }
  28. return vec;
  29. }

 

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

闽ICP备14008679号