您的位置:首页 > 其它

二叉树三种遍历调试运行版

2012-12-16 16:22 204 查看
头文件:

#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;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: