头文件:
#include <stdio.h>
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
先序输入建立:
void Create_BT(BinaryTreeNode *&bt)//先序输入二叉树
{
int d;
scanf("%d",&d);
if(d==-1)bt=NULL;
else
{
bt=(BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
bt->m_nValue=d;
Create_BT(bt->m_pLeft);
Create_BT(bt->m_pRight);
}
}
三种遍历方法:
void PreOrder(BinaryTreeNode *bt)
{
if(bt!=NULL)
{
printf("%d\n",bt->m_nValue);
PreOrder(bt->m_pLeft);
PreOrder(bt->m_pRight);
}
}
void InOrder(BinaryTreeNode *bt)
{
if(bt!=NULL)
{
InOrder(bt->m_pLeft);
printf("%d\n",bt->m_nValue);
InOrder(bt->m_pRight);
}
}
void PostOrder(BinaryTreeNode *bt)
{
if(bt!=NULL)
{
PostOrder(bt->m_pLeft);
PostOrder(bt->m_pRight);
printf("%d\n",bt->m_nValue);
}
}
void PreOrderStack(BinaryTreeNode *bt)
{
BinaryTreeNode *s[20];//栈
BinaryTreeNode *p=bt;
int top=-1;
while(p||top>-1)
{
while(p)
{
printf("%d\n",p->m_nValue);
s[++top]=p;
p=p->m_pLeft;
}
if(top>-1)
{
p=s[top];
top--;
p=p->m_pRight;
}
}
}
void InOrderStack(BinaryTreeNode *bt)
{
BinaryTreeNode *s[20];//栈
BinaryTreeNode *p=bt;
int top=-1;
while(p||top>-1)
{
while(p)
{
s[++top]=p;
p=p->m_pLeft;
}
if(top>-1)
{
p=s[top];
printf("%d\n",p->m_nValue);
top--;
p=p->m_pRight;
}
}
}
//后序二叉树非递归
struct stacknode
{
BinaryTreeNode *node;
int tag;//tag=0表示左子女已访问,tag=1表示右子女已访问
};
void PostOrderStack(BinaryTreeNode *bt)
{
stacknode s[20];//栈
stacknode temp;//暂存结点信息
BinaryTreeNode *p=bt;
int top=-1;
while(p||top>-1)
{
while(p)
{
temp.node=p;
temp.tag=0;
s[++top]=temp;
p=p->m_pLeft;
}
while(top>-1&&s[top].tag==1)//右子树已访问
{
printf("%d\n",s[top--].node->m_nValue);
}
if(top>-1)
{
s[top].tag=1;
p=s[top].node;
p=p->m_pRight;
}
}
}
main函数:
int main()
{
while(true)
{
BinaryTreeNode *bt;
Create_BT(bt);
PreOrderStack(bt);
InOrderStack(bt);
PostOrderStack(bt);
//PreOrder(bt);
//InOrder(bt);
//PostOrder(bt);
}
return 0;
}