非递归前序遍历:遇到一个节点,就访问该节点,并把节点推入栈中,然后下降去遍历它的左子树。
遍历完它的左子树后,从栈顶托出这个节点,并按照它的右链接指示的地址再去
遍历该节点的右子树结构。
非递归中序遍历:遇到一个节点,就把它推入栈中,并去遍历它的左子树。遍历完左子树后,从栈顶
托出这个节点并访问。然后按照它的右链接指示的地址再去遍历该节点的右子树。
非递归后序遍历:遇到一个节点,把它推入栈中,遍历它的左子树。遍历结束后,还不能马上访问
处于栈顶的该节点,而是要再按照它的右链接结构指示的地址去遍历该节点的右子树,
遍历完右子树后才能从栈顶托出该节点并访问。另外,需要给栈中的每个元素加上一个
特征位,以便当从栈顶托出一个节点时区别是从栈顶元素左边回来的(则要继续遍历右子树),
还是从右边回来的(该节点的左右节点均已周游)
特征为left表示已进入该节点的左子树,将从左边回来。
特征为right表示已进入该节点的右子树,将从右边回来。
#include <iostream>
#include <string>
#include <stack>
#include <vector>
using namespace std;
struct Node
{
int val;
Node* left;
Node* right;
Node(int x):val(x),left(nullptr),right(nullptr){};
};
void createBiTree(Node* &root)
{
int x;
cin>>x;
if (x==-1)
{
root = nullptr;
return;
}
root = new Node(x);
createBiTree(root->left);
createBiTree(root->right);
}
void visit(Node* T)
{
if (T->val!=-1)
cout<<T<<val<<" ";
}
//递归方式遍历
//先序递归遍历
void preOrder(Node* root)
{
if(root!=nullptr)
{
visit(root);
preOrder(root->left);
preOrder(root->right);
}
}
//中序递归遍历
void inOrder(Node* root)
{
if(root!=nullptr)
{
inOrder(root->left);
visit(root);
inOrder(root->right);
}
}
//后序递归遍历
void postOrder(Node* root)
{
if(root!=nullptr)
{
postOrder(root->left);
postOrder(root->right);
visit(root);
}
}
//非递归方式遍历
//先序遍历
void preOrderF(Node* root)
{
if (root==nullptr)
return;
stack<Node*> s;
s.push(root);
Node* p = nullptr;
while(!s.empty())
{
p.s.top();
s.pop();
cout<<p->val<< " ";
if (p->right)
s.push(p->right);
if(p->left)
s.push(p->left);
}
}
//中序遍历
void inOredrF(Node* root)
{
if(root == nullptr)
return;
stack<Node*> s;
Node* p = root;
while(p||!s.empty())
{
if(p)
{
s.push(p);
p = p->left;
}
else
{
p = s.top();
s.pop();
cout<<p->val<<" ";
p = p->right;
}
}
}
//后序遍历
void postOrderF(Node* root)
{
if(root == nullptr)
return;
stack<Node*> s;
std::vector<int> rs;
s.push(root);
Node* p = nullptr;
while(!s.empty())
{
p = s.top();
s.pop();
rs.insert(rs.begin(),p->val);
if(p->left)
s.push(p->left);
if(p->right)
s.push(p->right);
}
for(int i = 0;i<rs.size();i++)
cout<<rs[i]<< " ";
}
int main()
{
Node* root;
createBiTree(root);
preOrderF(root);
cout<<endl;
inOredrF(root);
cout<<endl;
postOrderF(root);
cout<<endl;
system("pause");
return 0;
}