C 二叉树:先序 中序 后序遍历

#include <stdio.h>
#include <stdlib.h>
#define N 20
typedef struct BITNODE
{
    int data;
    struct BITNODE *lchild;
    struct BITNODE *rchild;
}binode;

binode *creattree(int *a,int n);
void printnode(binode *root);
int preordertraverse(binode *root,void (*visit)(binode *root));
int midordertraverse(binode *root,void (*visit)(binode *root));
int postordertraverse(binode *root,void (*visit)(binode *root));
int main(){
    int a[N]={1,2,3,4,5,6,7};
    int n=7;
    int x;
    binode *root=NULL;
    root=creattree(a,n);
    x=preordertraverse(root,printnode);
    printf("\n");
    printf("%d\n",x);
    midordertraverse(root,printnode);
    printf("\n");
    postordertraverse(root,printnode);
    printf("\n");
    return 0;

}

binode *creattree(int *a,int n){
    int i;
    binode *pnode[N]={NULL};
    for(i=0;i<n;i++){
        pnode[i]=(binode *)malloc(sizeof(binode));
        if(pnode[i]==NULL)exit(1);
        pnode[i]->data=a[i];
        pnode[i]->lchild=NULL;
        pnode[i]->rchild=NULL;
    }
    for(i=0;i<n/2;i++){
        pnode[i]->lchild=pnode[2*(i+1)-1];
        pnode[i]->rchild=pnode[2*(i+1)];
    }
    return pnode[0];
}

void printnode(binode *root){
    printf("%3d",root->data);
}

//先序遍历
int preordertraverse(binode *root,void (*visit)(binode *root)){
    if(root==NULL){
        return 1;
    }
    (*visit)(root);//根节点最先访问
    if(preordertraverse(root->lchild,visit)){
        if(preordertraverse(root->rchild,visit)){
            return 1;
        }

    }
    return 0;//这一句对于程序结果来说无影响,可不写,但是会有warning
    //(因为函数执行时到不了这里),最后回到最顶端节点时,返回值为1,在上面那一步就返回了
}

//中序遍历
int midordertraverse(binode *root,void (*visit)(binode *root)){
    if(root==NULL){
        return 1;
    }
    if(midordertraverse(root->lchild,visit)){

        (*visit)(root);//根节点在中间被访问
            if(midordertraverse(root->rchild,visit)){
                return 1;
        }

    }

}

//后序遍历
int postordertraverse(binode *root,void (*visit)(binode *root)){
    if(root==NULL){
        return 1;
    }
    if(postordertraverse(root->lchild,visit)){
        if(postordertraverse(root->rchild,visit)){
                (*visit)(root);//根节点最后被访问
                return 1;
        }

    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值