二叉树的遍历,递归和非递归

向右看齐 2024-04-17 05:44 168阅读 0赞

1,中序遍历

非递归版本,借助一个辅助

  1. vector<int> ans;
  2. vector<int> inorderTraversal(TreeNode* root) {
  3. TreeNode *node = root;
  4. stack<TreeNode *> mstack;
  5. while(node != NULL || !mstack.empty())
  6. {
  7. while(node != NULL)
  8. {
  9. mstack.push(node); // 注意这里入栈不能写指针,写结点
  10. node = node->left;
  11. }
  12. ans.push_back(mstack.top()->val); // 注意这里是 .
  13. node = mstack.top()->right;
  14. mstack.pop();
  15. }
  16. return ans;
  17. }

递归版本,简洁

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

2,二叉树的后续遍历

非递归版本,后续遍历稍微麻烦点,通过设置一个 “前一个节点”变量,来记录下一次应该访问的结点

  1. vector<int> ans;
  2. vector<int> postorderTraversal(TreeNode* root)
  3. {
  4. if(root == NULL)
  5. return ans;
  6. stack<TreeNode*> mstack;
  7. TreeNode* pre = NULL; //前一个节点
  8. while(!mstack.empty()|| root != NULL)
  9. {
  10. if(root != NULL)
  11. {
  12. mstack.push(root);
  13. root = root->left;
  14. }
  15. else
  16. {
  17. root=mstack.top();
  18. if(root->right == NULL || root->right == pre)
  19. {
  20. //如果右子树不存在,则接下来该访问根节点。
  21. mstack.pop();
  22. ans.push_back(root->val);
  23. pre = root;
  24. root = NULL;
  25. }
  26. else
  27. {
  28. //否则柚子树存在,就先访问右子树
  29. pre = NULL;
  30. root = root->right;
  31. }
  32. }
  33. }
  34. return ans;
  35. }

递归版本,简洁

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

发表评论

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

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

相关阅读