#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;
}
}
}
C 二叉树:先序 中序 后序遍历
最新推荐文章于 2023-03-08 16:06:22 发布