当前位置:   article > 正文

leetcode 二叉树的遍历栈的实现 Preorder Traversal Inorder Traversal Postorder Traversal_given the preorder traversal and inorder traversal

given the preorder traversal and inorder traversal of a binary tree. write a pro
题目意思是二叉树的三种遍历方式,不用递归用栈实现,之前数据结构中做过。
先序遍历:大概就是每次都pop一个,然后加右孩子,左孩子。

Given a binary tree, return the preorder traversal of its nodes' values.

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

   1
    \
     2
    /
   3

return [1,2,3].

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

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

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

后序遍历:大概就是有左右子树就push,没有左子树和右子树或者已经处理过了就输出,这里已经处理过了可以用一个child节点记录上一个输出的node,若这个child是栈顶的左孩子或者右孩子就表示已经处理过了。
  1. class Solution {
  2. public:
  3. vector<int> postorderTraversal(TreeNode* root) {
  4. vector<int>res;
  5. if (!root) return res;
  6. stack<TreeNode*>S;
  7. S.push(root);
  8. TreeNode* node = root;
  9. TreeNode* child = node;
  10. while (!S.empty())
  11. {
  12. node = S.top();
  13. if ((!node->left&&!node->right) || child == node->left || child == node->right)//左右都空了或者孩子已经处理完成了
  14. {
  15. res.push_back(node->val);
  16. S.pop();
  17. child = node;
  18. }
  19. else{ //先把右孩子push,再把左孩子push
  20. if (node->right) S.push(node->right);
  21. if (node->left) S.push(node->left);
  22. }
  23. }
  24. return res;
  25. }
  26. };



声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号