二叉树的递归图:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
using namespace std;
typedef char ElemType;
typedef struct BiNode
{
ElemType data;
struct BiNode *Left;
struct BiNode *Right;
}BiNode, *BiTree;
void create(BiTree &T)
{
ElemType c;
scanf("%c", &c);
if (c == '#')
T = NULL;
else {
T = (BiTree)malloc(sizeof(BiNode));
T->data = c;
create(T->Left);
create(T->Right);
}
}
void preorder(BiTree T)
{
if (T)
{
printf("%c\t", T->data);
preorder(T->Left);
preorder(T->Right);
}
}
void inorder(BiTree T)
{
if (T)
{
inorder(T->Left);
printf("%c\t", T->data);
inorder(T->Right);
}
}
void postorder(BiTree T)
{
if (T)
{
postorder(T->Left);
postorder(T->Right);
printf("%c\t", T->data);
}
}
void preorder1(BiTree T)
{
stack<BiTree>S;
S.push(T);
while (!S.empty())
{
T = S.top(); S.pop();
printf("%c\t", T->data);
if (T->Right)S.push(T->Right);
if (T->Left)S.push(T->Left);
}
}
void preorder2(BiTree T)
{
stack<BiTree>S;
while (T || !S.empty())
{
while (T)
{
S.push(T);
printf("%c\t", T->data);
T = T->Left;
}
if (!S.empty())
{
T = S.top(); S.pop();
T = T->Right;
}
}
}
void postorder1(BiTree T)
{
stack<BiTree>S;
BiTree Previsited = NULL;
while (T || !S.empty())
{
while (T)
{
S.push(T);
T = T->Left;
}
BiTree tmp = S.top();
if (tmp->Right == NULL||tmp->Right == Previsited)
{
printf("%c\t", tmp->data);
Previsited = tmp;
S.pop();
}
else
T = tmp->Right;
}
}
enum State { Start, return_from_left, return_from_right };
typedef struct { enum State state; BiTree T; }StackElem;
void postorder2(BiTree BT)
{
StackElem item = { Start,BT };
stack<StackElem>S;
while (1)
{
if (item.T)
{
if (item.state == Start)
{
S.push(item);
item.T = item.T->Left;
item.state = Start;
}
else if (item.state == return_from_left)
{
S.push(item);
item.T = item.T->Right;
item.state = Start;
}
else
{
printf("%c\t", item.T->data);
if (!S.empty())
{
item = S.top(); S.pop();
item.state = (enum State)(item.state + 1);
}
else break;
}
}
else
{
if (!S.empty())
{
item = S.top(); S.pop();
item.state = (enum State)(item.state + 1);
}
else break;
}
}
}
void levelorder(BiTree T)
{
queue<BiTree>Q;
BiTree tmp = T;
if (T)
{
Q.push(tmp);
while (!Q.empty())
{
tmp = Q.front(); Q.pop();
printf("%c\t", tmp->data);
if (tmp->Left)Q.push(tmp->Left);
if (tmp->Right)Q.push(tmp->Right);
}
}
}
int main()
{
BiTree T;
create(T);
preorder(T);
printf("\n");
inorder(T);
printf("\n");
postorder(T);
printf("\n");
system("pause");
}