ツリーが再帰的でないバージョンを巡回する
17207 ワード
#include
using namespace std;
typedef struct Node* pNode;
struct Node {
char c;
pNode lchild, rchild;
Node(char c, pNode lchild = nullptr, pNode rchild = nullptr) :
c(c), lchild(lchild), rchild(rchild) {}
};
pNode build()
{
/*
A
/ \
B C
/ \ / \
D E F G
/ \
H I
*/
pNode root = new Node('A');
root->lchild = new Node('B');
root->rchild = new Node('C');
root->lchild->lchild = new Node('D');
root->lchild->rchild = new Node('E');
root->rchild->lchild = new Node('F');
root->rchild->rchild = new Node('G');
root->rchild->lchild->lchild = new Node('H');
root->rchild->lchild->rchild = new Node('I');
return root;
}
void visit(pNode x)
{
cout << x->c << " ";
}
/*
, , ,
, , ;
, ,
, , .
*/
void preVisitStack(pNode root)
{
stack<pNode> st;
pNode p = root;
while (p || !st.empty()) {
if (p) {
visit(p);
st.push(p);
p = p->lchild;
}
else {
p = st.top();
st.pop();
p = p->rchild;
}
}
cout << endl;
}
/*
, ,
,
, ,
, .
*/
void midVisitStack(pNode root)
{
stack<pNode> st;
pNode p = root;
while (p || !st.empty()) {
if (p) {
st.push(p);
p = p->lchild;
}
else {
p = st.top();
visit(p);
st.pop();
p = p->rchild;
}
}
cout << endl;
}
/*
, , ,
, ,
, 1,
, ;
, ,
1, , 2,
, ,
2, , .
, STL pair .
*/
void backVisitStack(pNode root)
{
stack<pair<pNode, int> > st;
pNode p = root;
while (p || !st.empty()) {
if (p) {
st.push(make_pair(p, 1));
p = p->lchild;
}
else {
auto now = st.top();
st.pop();
if (now.second == 1) {
st.push(make_pair(now.first, 2));
p = now.first->rchild;
}
else
visit(now.first);
}
}
cout << endl;
}
int main()
{
pNode root = build();
preVisitStack(root);
midVisitStack(root);
backVisitStack(root);
}