主题:[原创]二叉树的应用~!
小弟刚学的二叉树.
就把他综合了一下.
请大家指教:
//二叉树的基本操作///////////////////////////
#include <stdio.h>
#include <malloc.h>
//定义二叉树
typedef struct bitnode
{
int data;
struct bitnode *lchild,*rchild;
}bitnode,*bitree;
//创建二叉树利用先序创建
void createbitree(bitree *T)
{
int dat;
printf("Please Input data:");
scanf("%d",&dat);
if(dat==0) (*T) = NULL;
else
{
(*T) = (bitree)malloc(sizeof(bitnode));
(*T)->data=dat;
createbitree(&((*T)->lchild));
createbitree(&((*T)->rchild));
}
}
//二叉树的先序周游递归算法
void postorder10(bitree T)
{
if (T != NULL)
{
printf("%d\t",T->data);
postorder10(T->lchild);
postorder10(T->rchild);
}
}
//二叉树的先序周游非递归算法
void postorder11(bitree t)
{ bitree s[100];
int top=0;
while (t!=NULL || top!=0)
{
while (t!=NULL)
{
printf("%d\t",t->data); s[++top]=t; t=t->lchild ;
}
if (top!=0)
{
t=s[top--]->rchild;
}
}
}
//二叉树的中序周游递归算法
void postorder20(bitree T)
{
if (T != NULL)
{
postorder20(T->lchild);
printf("%d\t",T->data);
postorder20(T->rchild);
}
}
//二叉树的中序周游非递归算法
void postorder21(bitree t)
{
bitree s[100];//指针数组(栈),存放按中序访问的节点的地址
int top=0;
while (t!=NULL || top!=0)
{
while (t!=NULL)
{
s[++top]=t; t=t->lchild ;
}
if (top!=0)
{
t=s[top--]; printf("%d\t",t->data); t=t->rchild;
}
}
}
//二叉树的后序周游递归算法
void postorder30(bitree T)
{
if (T != NULL)
{
postorder30(T->lchild);
postorder30(T->rchild);
printf("%d\t",T->data);
}
}
//二叉树的后序周游非递归算法
void postorder31(bitree t)
{
typedef struct node
{ bitree t; int tag;
} stack;
stack s[100] ;
int top=0;
while (t!=NULL|| top!=0)
{while (t!=NULL)
{s[++top].t=t; s[top].tag=0; t=t->lchild; }
while (top!=0 && s[top].tag==1)
printf("%d\t" ,s[top--].t->data);
if (top)
{ s[top].tag=1; t=s[top].t->rchild ; }
}
}
就把他综合了一下.
请大家指教:
//二叉树的基本操作///////////////////////////
#include <stdio.h>
#include <malloc.h>
//定义二叉树
typedef struct bitnode
{
int data;
struct bitnode *lchild,*rchild;
}bitnode,*bitree;
//创建二叉树利用先序创建
void createbitree(bitree *T)
{
int dat;
printf("Please Input data:");
scanf("%d",&dat);
if(dat==0) (*T) = NULL;
else
{
(*T) = (bitree)malloc(sizeof(bitnode));
(*T)->data=dat;
createbitree(&((*T)->lchild));
createbitree(&((*T)->rchild));
}
}
//二叉树的先序周游递归算法
void postorder10(bitree T)
{
if (T != NULL)
{
printf("%d\t",T->data);
postorder10(T->lchild);
postorder10(T->rchild);
}
}
//二叉树的先序周游非递归算法
void postorder11(bitree t)
{ bitree s[100];
int top=0;
while (t!=NULL || top!=0)
{
while (t!=NULL)
{
printf("%d\t",t->data); s[++top]=t; t=t->lchild ;
}
if (top!=0)
{
t=s[top--]->rchild;
}
}
}
//二叉树的中序周游递归算法
void postorder20(bitree T)
{
if (T != NULL)
{
postorder20(T->lchild);
printf("%d\t",T->data);
postorder20(T->rchild);
}
}
//二叉树的中序周游非递归算法
void postorder21(bitree t)
{
bitree s[100];//指针数组(栈),存放按中序访问的节点的地址
int top=0;
while (t!=NULL || top!=0)
{
while (t!=NULL)
{
s[++top]=t; t=t->lchild ;
}
if (top!=0)
{
t=s[top--]; printf("%d\t",t->data); t=t->rchild;
}
}
}
//二叉树的后序周游递归算法
void postorder30(bitree T)
{
if (T != NULL)
{
postorder30(T->lchild);
postorder30(T->rchild);
printf("%d\t",T->data);
}
}
//二叉树的后序周游非递归算法
void postorder31(bitree t)
{
typedef struct node
{ bitree t; int tag;
} stack;
stack s[100] ;
int top=0;
while (t!=NULL|| top!=0)
{while (t!=NULL)
{s[++top].t=t; s[top].tag=0; t=t->lchild; }
while (top!=0 && s[top].tag==1)
printf("%d\t" ,s[top--].t->data);
if (top)
{ s[top].tag=1; t=s[top].t->rchild ; }
}
}