树的非递归遍历——前序中序后序

Posted liangf27

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树的非递归遍历——前序中序后序相关的知识,希望对你有一定的参考价值。

树的递归遍历非常简单,也是写树的遍历时最常用的写法。但是我发现自己对树的非递归遍历并不十分熟悉,所以把三种非递归遍历都写了一遍,以后看到这篇记录博客也可以帮助自己好好回想熟悉一下。

Leetcode对应习题:前序中序后序

相对而言,这三种非递归遍历的难度——前序 < 中序 < 后序。

对于第三种(非递归后序遍历)方法,只要稍微调整下第18~19行三个节点push的顺序,就可以实现前中后序的遍历。

树的非递归前序:

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

树的非递归中序:

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

 

树的非递归后序遍历:

 1 class Solution {
 2 public:
 3     vector<int> postorderTraversal(TreeNode* root) {
 4         stack<pair<TreeNode*, bool> > s;
 5         vector<int> re;
 6         s.push(make_pair(root, false));
 7         bool visited;
 8         while(!s.empty()){
 9             pair<TreeNode*, bool> p = s.top();
10             s.pop();
11             visited = p.second;
12             if(!p.first){
13                 continue;
14             }
15             if(visited){
16                 re.push_back(p.first->val);
17             }else{
18                 s.push(make_pair(p.first, true));
19                 s.push(make_pair(p.first->right, false));
20                 s.push(make_pair(p.first->left, false));
21             }
22         }
23         return re;
24     }
25 };

 

以上是关于树的非递归遍历——前序中序后序的主要内容,如果未能解决你的问题,请参考以下文章

二叉树前序中序后序遍历(非递归统一解法)

二叉树的非递归遍历(先序中序后序和层序遍历)

二叉树的前序中序后序遍历相互求法

二叉树的前序中序后序遍历-非递归-使用同一段代码实现

用递归算法先序中序后序遍历二叉树

二叉树的前序中序后序层次遍历的递归与非递归实现