先序遍历、中序遍历二叉树非递归实现

柔情只为你懂 2022-07-16 03:21 322阅读 0赞

先序遍历

leetcode 144. binary-tree-preorder-traversal

  1. /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */
  2. class Solution {
  3. public:
  4. vector<int> preorderTraversal(TreeNode* root) {
  5. return preorderTraversalIteratively(root);
  6. }
  7. /* 先序遍历递归版本 */
  8. void preorderTraversalRecursion(TreeNode* root){
  9. if(root){
  10. cout<<root->val<<endl;
  11. preorderTraversalRecursion(root->left);
  12. preorderTraversalRecursion(root->right);
  13. }
  14. }
  15. /* 先序遍历非递归版本 */
  16. vector<int> preorderTraversalIteratively(TreeNode* root){
  17. stack<TreeNode*>S; // 初始化栈 S
  18. vector<int>v; // v 记录访问节点的顺序
  19. // 两种情况:
  20. // 只要左子树不为空那么就一直向左走
  21. // 走到最左边时,看是否有
  22. while(root || !S.empty()){
  23. // 左子树不为空一直往左走
  24. if(root){
  25. v.push_back(root->val); // 访问根节点
  26. S.push(root); // 根节点入栈,因为左子树访问完毕时需要回来再访问右子树
  27. root = root->left; // 访问左子树
  28. }
  29. // 走到最左边后,开始向右走
  30. else{
  31. root = S.top();
  32. S.pop();
  33. root = root->right;
  34. }
  35. }
  36. return v;
  37. }
  38. };

中序遍历

leetcode 94. Binary Tree Inorder Traversal

  1. /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */
  2. class Solution {
  3. public:
  4. vector<int> inorderTraversal(TreeNode* root) {
  5. return inorderTraversalInteratively(root);
  6. }
  7. /* 中序遍历递归版本*/
  8. void inorderTraversalRecursion(TreeNode* root){
  9. if(root){
  10. inorderTraversalRecursion(root->left);
  11. cout<<root->val<<endl; // 访问根节点
  12. inorderTraversalRecursion(root->right);
  13. }
  14. }
  15. /* 中序遍历非递归版本 */
  16. vector<int> inorderTraversalInteratively(TreeNode* root){
  17. stack<TreeNode*>S;
  18. vector<int>v;
  19. /* 第一种写法 while(root || !S.empty()){ if(root){ S.push(root); root = root->left; } else{ root = S.top(); v.push_back(root->val); // 注意与先序遍历的区别 S.pop(); root = root->right; } } */
  20. /* 第二种写法 */
  21. while(root || !S.empty()){
  22. /* 左子树全部入栈 */
  23. while(root){
  24. S.push(root);
  25. root = root->left;
  26. }
  27. if(!S.empty()){
  28. root = S.top();
  29. v.push_back(root->val); // 访问根节点
  30. S.pop();
  31. root = root->right; // 下一次循环遍历右子树
  32. }
  33. }
  34. return v;
  35. }
  36. };

发表评论

表情:
评论列表 (有 0 条评论,322人围观)

还没有评论,来说两句吧...

相关阅读