#include<stdio.h>
#include<stdlib.h>
typedef struct treeNode
{
char data;
struct treeNode* LChild;
struct treeNode*RChild;
}TREE,*LPTREE;
LRTREE createNode(char data)
{
LRTREE newNode = (LRTREE)malloc(sizeof(TREE));
newNode->data = data;
newNode->LChild = NULL;
newNode->RChild = NULL;
return newNode;
}
void insertNode(LRTREE parentNode,LRTREE LChild, LRTREE RChild)
{
parentNode->LChild = LChild;
parentNode->RChild = RChild;
}
void printCurNodeData(LRTREE curData)
{
printf("%c\t", cruData->data);
}
void preOderByStack(LRTREE root)
{
if(root == NULL)
return;
struct treeNode*stack[10];
int stackTop = -1;
LRTREE pMove = root;
while(stackTop != -1 || pMove)
{
while(pMove)
{
printf("%c\t",pMove->data);
stack[++stackTop] = pMove;
pMove = pMove->LCHild;
}
if(stackTop != -1)
{
pMove = stack[stackTop];
stackTop--;
pMove = pMove->RCHild;
}
}
}
void preOrder(LRTREE root)
{
if(root != NULL)
{
printCurNodeData(root);
preOrder(root->LChild);
preOrder(root->RChild);
}
}
void midOrder(LRTREE root)
{
if(root != NULL)
{
midOrder(root->LChild);
printCurNodeData(root);
midOrder(root->RChild);
}
}
void midOrderByStack(LRTREE root)
{
if(root == NULL)
return;
struct treeNode* stack[10];
int stackTop = -1;
LRTREE pMove = root;
while(stackTop != -1||pMove)
{
while(pMove)
{
stack[++stackTop] = pMove;
pMove = pMove->LCHild;
}
if(stackTop != -1)
{
pMove = stack[stackTop--];
printf("%c\t",pMove->data);
pMove = pMove->RCHild;
}
}
}
void lastOrder(LRTREE root)
{
if(root != NULL)
{
lastOrder(root->LChild);
lastOrder(root->RChild);
printCurNodeData(root);
}
}
void lastOrderByStack(LRTREE root)
{
if(root == NULL)
return;
struct treeNode* stack[10];
int stackTop = -1;
struct treeNode*pMove = root;
struct treeNode*pLastVisit = NULL;
while(pMove)
{
stack[++stackTop] = pMove;
pMove = pMove->LChild;
}
while(stackTop != -1)
{
pMove = stack[stackTop--];
if(pMove->RChild == NULL||pMove->RChild == pLastVisit)
{
printf("%c\t",pMove->data);
pLastVisit=pMove;
}
else
{
stack[++stackTop] = pMove;
pMove = pMove->RChild;
while(pMove)
{
stack[++stackTop] = pMove;
pMove = pMove->LChild;
}
}
}
}
int main()
{
LRTREE A = createNode('A');
LRTREE B = createNode('B');
LRTREE C = createNode('C');
LRTREE D = createNode('D');
LRTREE E = createNode('E');
LRTREE F = createNode('F');
LRTREE G = createNode('G');
insertNode(A , B ,C);
insertNode(B , D ,NULL);
insertNode(C , E ,F);
printf("\n先序遍历:\n");
preOrder(A);
printf("\n");
preOderByStack(A);
printf("\n中序遍历:\n");
midOrder(A);
midOrderByStack(A);
printf("\后序遍历:\n");
lastOrder(A);
lastOrderByStack(A);
system("pause");
return 0;
}