生成二叉树 非递归,递归遍历二叉树

来源:互联网 发布:知乎的通知怎么删除 编辑:程序博客网 时间:2024/05/17 01:53
#include<stdio.h>
#include<stdlib.h>


typedef int datatype;
typedef struct node
{
datatype data;
struct node *lchild ,*rchild;
}btree,*btreelink;


void bitree(btreelink *b);
void preorder(btreelink b);
void inorder(btreelink b);
void postorder(btreelink b);
void unpreorder(btreelink b);
void uninorder(btreelink b);

void unpostorder(btreelink b);


void bitree(btreelink *b)//利用先序遍历的方式生成树
{
int c;
scanf("%d",&c);
if(c==-1)
*b=NULL;
else
{
(*b)=(btreelink)malloc(sizeof(btree));
(*b)->data=c;
bitree(&(*b)->lchild);
bitree(&(*b)->rchild);
}
}
void unpreorder(btreelink b)//非递归法,先序遍历二叉树
{
btreelink a[20];
int top=0;
btreelink p;
if(b)
{
top++;
a[top]=b;
}
while(top>0)
{

p=a[top];
top--;
printf("%d ,",p->data);
if(p->rchild)
{
top++;
a[top]=p->rchild;
}
if(p->lchild)
{
top++;
a[top]=p->lchild;
}
}
}


void preorder(btreelink b)//递归法,先序遍历二叉树
{
if(b!=NULL)
{
printf("%d ,",b->data);
preorder(b->lchild);
preorder(b->rchild);
}
}
void uninorder(btreelink b)//非递归法,中序遍历二叉树
{
btreelink a[20],p=b;
int top=0;
while(top>0||p)
{
while(p)
{
top++;
a[top]=p;
p=p->lchild;
}
if(top>0)
{
p=a[top];
top--;
printf("%d ,", p->data);
p=p->rchild;
}
}
}
void inorder(btreelink b)//递归法,中序遍历二叉树
{


if(b!=NULL)
{
inorder(b->lchild);
printf("%d ,",b->data);
inorder(b->rchild);
}
}
void unpostorder(btreelink b)//非递归法,后序遍历二叉树
{
    btreelink cur;                      //当前结点 
    btreelink pre=NULL;                 //前一次访问的结点 
    btreelink a[20];
    int top=0;
    top++;
    a[top]=b;
    while(top>0)
    {
        cur=a[top];
        if((cur->lchild==NULL&&cur->rchild==NULL)||(pre!=NULL&&(pre==cur->lchild||pre==cur->rchild)))//没有左右子树,后者左右子树被访问过则输出,排除\根结点
        {
            printf("%d ,",cur->data);  
            top--;
            pre=cur; 
        }
        else
        {
            if(cur->rchild!=NULL)
                {
                top++;
                a[top]=cur->rchild;
                }
             if(cur->lchild!=NULL)    
                {
                top++;
                a[top]=cur->lchild;
                }
        }
    }    
}
void postorder(btreelink b)//递归法,后序遍历二叉树
{


if(b!=NULL)
{
postorder(b->lchild);
postorder(b->rchild);
printf("%d ,",b->data);
}
}

原创粉丝点击