中序遍历二叉树c语言
❶ 编程实现以上二叉树中序遍历操作,输出遍历序列,求写代码~~
#include<stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
#define OVERFLOW 0
typedef char TElemType;
typedef int Status;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef enum {Link,Thread} PointerTag;
typedef struct BiThrNode
{
TElemType data;
struct BiThrNode *lchild,*rchild;
PointerTag LTag,RTag;
}BiThrNode;
typedef BiThrNode *BiThrTree;
BiTree CreateBiTree(BiTree T) //先序遍历构造二叉树
{
char ch;
scanf("%c",&ch);
if(ch=='#') //#代表空指针
T=NULL;
else
{
T=(BiTNode *)malloc(sizeof(BiTNode)); //申请结点
if(!T)
exit(OVERFLOW);
T->data=ch; //生成根结点
T->lchild=CreateBiTree(T->lchild); //构造左子树
T->rchild=CreateBiTree(T->rchild); //构造右子树
}
return T;
}
Status InOrderTraverse(BiTree T,Status(*visit)(TElemType))
{//中序遍历二叉树
if(T)
{
if(InOrderTraverse(T->lchild,visit))
if(visit(T->data))
if(InOrderTraverse(T->rchild,visit))
return OK;
return ERROR;
}
else
return OK;
}
Status PrintElement(TElemType e)
{
printf("%-2c",e);
return OK;
}
void main()
{
BiTree T=NULL;
printf("请输入构造二叉树的字符序列:");
T=CreateBiTree(T);
if(T)
printf("二叉树建立成功!
");
else
printf("二叉树构造失败!!!
");
printf("中序遍历二叉树:");
InOrderTraverse(T,PrintElement);
printf("
");
}

❷ c语言 关于二叉树的创建和遍历(中序遍历)
这个还是我学《数据结构》时做的有关二叉树的练习呢,本来是全的,包括树的初始化,建立,遍历(中序、前序、后序和层次),还有输出,复制,删除节点,求深度,树的删除等等,看你只问了有关创建和中序遍历的,所以选了一部分给你,供你参考吧! 
#include <stdio.h> 
#include <malloc.h> 
#define MaxSize 10 
#define Number 30 
struct BiTNode{//定义数据结构 
char data; 
BiTNode *lchild,*rchild; 
}; 
void InitBtree(BiTNode * &BT){//初始化二叉树 
BT=NULL; 
} 
void CreateBiTree(BiTNode *&BT,char *str){//建立二叉树 
BiTNode *s[MaxSize];//这里定义了一个数组用作堆栈方便检查输入和操作 
int top=-1; 
BT=NULL; 
BiTNode *p=NULL; 
int k, j=0; 
char ch; 
ch=str[j]; 
while(ch!='\0'){ 
switch(ch){ 
case '(': 
top++; 
s[top]=p; 
k=1; 
break; 
case ')': 
top--; 
break; 
case ',': 
k=2; 
break; 
default: 
p=(struct BiTNode *) malloc(sizeof(struct BiTNode)); 
p->data=ch; 
p->lchild=p->rchild=NULL; 
if(BT==NULL) 
BT=p; 
else{ 
if(k==1) 
s[top]->lchild=p; 
else 
s[top]->rchild=p; 
} 
} 
j++; 
ch=str[j]; 
} 
} 
void inorder(BiTNode *BT){//中序遍历二叉树——递归形式 
if(BT!=NULL){ 
inorder(BT->lchild ); 
printf("%c ",BT->data); 
inorder(BT->rchild ); 
} 
} 
void main(){ 
BiTNode *BT; 
printf("以广义表形式表示输入的二叉数 (如A(B(C,D),E(,F))的形式)\n\n"); 
char string[Number]="A(B(,C),D(E(F),G(,H)))"; 
//如果想要自己输入,可以将下边的注释去掉,然后自己按照广义表形式输入, 
//(如上例的形式)此处为了方便查看,用了默认的数值 
//这里之所以用此种形式(广义表形式输入)是为了保证输入的数组成的二叉树完全符合你所定义的树的形状 
/*char string[Number],ch; 
int i=0; 
ch=getchar(); 
while(ch!='\n' && i<Number){ 
string[i]=ch; 
i++; 
ch=getchar(); 
} 
string[i]='\0'; 
*/ 
InitBtree(BT);//初始化二叉树 
CreateBiTree(BT,string);//创建二叉树 
printf("\n中序遍历二叉树顺序为: "); 
inorder(BT);//中序遍历二叉树 
printf("\n"); 
} 
程序不复杂,所以只是加了必要和最简单的注释,相信你看看应该完全可以理解的,祝你进步!
❸ 用递归算法先序中序后序遍历二叉树
1、先序
void PreOrderTraversal(BinTree BT)
{
if( BT )
{
枣芦 printf(“%d ”, BT->Data); //对节点做些访问比如打印
PreOrderTraversal(BT->Left); //访问左儿子
PreOrderTraversal(BT->Right); //访问右儿子
}
}
2、中序
void InOrderTraversal(BinTree BT)
{
if(BT)
{
InOrderTraversal(BT->Left);
printf("%d ", BT->Data);
InOrderTraversal(BT->Right);
}
}
3、后序
void PostOrderTraversal(BinTree BT)
{
if (BT)
{
PostOrderTraversal(BT->Left);
PostOrderTraversal(BT->Right);
printf("%d ", BT->Data);
}
}

(3)中序遍历二叉树c语言扩展阅读:
注意事项
1、前序遍历
从整棵二叉树的根结点开始,对于任意结点VV,访问结点VV并将结点VV入栈,并判断结点VV的左子结点LL是否为空。若LL不为空,则将LL置为当前结点VV;若LL为空,则取出栈顶结点,并将栈顶结点的右子结点置为当前结点VV。
2、中序遍历
从整棵凳滑带二叉树的根结点开始,对于任一结点VV,判断其左子结点LL是否为空。若LL不为空,则将VV入栈并将L置为当前结点VV;若让袭LL为空,则取出栈顶结点并访问该栈顶结点,然后将其右子结点置为当前结点VV。重复上述操作,直到当前结点V为空结点且栈为空,遍历结束。
3、后序遍历
将整棵二叉树的根结点入栈,取栈顶结点VV,若VV不存在左子结点和右子结点,或VV存在左子结点或右子结点,但其左子结点和右子结点都被访问过了,则访问结点VV,并将VV从栈中弹出。若非上述两种情况,则将VV的右子结点和左子结点依次入栈。重复上述操作,直到栈为空,遍历结束。
❹ 用C语言建立一棵含有n个结点的二叉树,采用二叉链表存储,然后分别实现前序,中序,后序遍历该二叉树
#include <stdio.h>
#include <stdlib.h>
#define max 100
typedef struct node{  //二叉树结构
	char data;
	struct node *lc,*rc;  //左右子树
}bt,*list;
/*
二叉树
     A
	/ \
   B   C
  / \   \
 D   E   F
/       / \
K	   G   H
input 
ABDK000E00C0FG00H00
ouput
  ABDKECFGH
  KDBEACGFH
  KDEBGHFCA
*/
int  creat(list*root){ //创建一棵二叉树,root使用的是二维指针
	char n;
	scanf(" %c",&n); //注%C前面加空格是为了起间隔作用 scanf不读入空格
	if (n=='0')  //0为间隔
	{
		*root=NULL; return 0;  //输入结束
	}	
	*root=(list)malloc(sizeof(bt));
	if (!*root) return 0;	      
	(*root)->data=n;
	creat(&(*root)->lc);
	creat(&(*root)->rc);
	return 1;
}
int pre(list root){ //先序遍历
	if (!root) return 0;	
	printf("%c",root->data);
	pre(root->lc);
	pre(root->rc);
	return 1;
}
int mid(list root){ //中序遍历
	if (!root)	return 0;
	mid(root->lc);
	printf("%c",root->data);
	mid(root->rc);
	return 1;
}
int	 bh(list root){ //后序遍历
	if (!root)  return 0;	    
	bh(root->lc);
	bh(root->rc);
	printf("%c",root->data);
	return 1;
}
int sum(list root,int *cnt){ //求结点的个数sum
	if(root){
		(*cnt)++;
		sum(root->lc,cnt);
		sum(root->rc,cnt);
		return 1;
	}
	return 0;
}
int sumleaf(list root,int *cnt){  //求叶子节点的个数
	if (root)
	{
		if ((!root->lc)&&(!root->rc))
		{  (*cnt)++; }		
		sumleaf(root->lc,cnt);
		sumleaf(root->rc,cnt);
		return 1;
	}
	return 0;
}
int deep(list root,int *cnt){ //求深度
    if (!root)
    {
		*cnt=0;	return 0;	
    }
	int m,n;
	n=m=*cnt;
	deep(root->lc,&m);
	deep(root->rc,&n);
	*cnt=m+1;
	if(m<n) *cnt=n+1;
	return 1;
}
int floor(list root){ //层次遍历
	  if(root)
	  { 
		  list s[max];	  int front,rear; //用队进行存储
	      front=-1;	  rear=0;  s[rear]=root; //初始化	  
		  while (rear!=front) //当队为空时结束
		  {
			  printf("%c",s[++front]->data);
              if (s[rear]->lc)
              {s[1+rear]=s[rear]->lc; rear++;  }  //将左子树存入队列中            
			  if (s[rear]->rc)
              {s[1+rear]=s[rear]->rc; rear++;  }  //将右子书存入队列中
		  }
		  return 1;
	  }
	  return 0;
}
int scop(list *r,list *p){ //树的复制
    if(*r){
     *p=(list)malloc(sizeof(bt));
	 if(*p){
		 (*p)->data=(*r)->data;
		 scop(&(*r)->lc,&(*p)->lc);
		 scop(&(*r)->rc,&(*p)->rc);
		 return 1;
	 }
	}
	*p=NULL;
	return 0;
}
int sepect(list root,list *p,char e){ //查找节点返回指针*p p为二级指针
	if(root){
		if (root->data==e)
		{ *p=root; return 1;
		}
		sepect(root->lc,p,e);
		sepect(root->rc,p,e);
	}
	return 0;
}
void main(){
	list b,s,m;	
	int n,t=1;  
	char ch='\0';  
	printf("***********Bitree************\n");
	while(t){      //循环操作
	printf("input a tree(int):\n"); 
	s=m=b=NULL; //二叉树的初始化
	creat(&b);
	//按三种遍历输出二叉树
	printf("\npre ");  pre(b);    
	printf("\nmid ");  mid(b);   
	printf("\nbh  ");  bh(b);    printf("\n");
	//求节点数目,叶子节点的个数,深度
	n=0;  sum(b,&n);     printf("sumdata:  %d\n",n);    
	n=0;  sumleaf(b,&n); printf("sumleaf:  %d\n",n); 
	n=0;  deep(b,&n);    printf("deep:     %d\n",n); 
	//二叉树的复制
	scop(&b,&s);  
	printf("\ns tree:\npre ");	
	pre(s);  printf("\nmid ");   
	mid(s);  printf("\nbh  ");   
	bh(s);   printf("\n");
	//查找节点
	printf("sepect a data:\n");
	scanf(" %c",&ch); //注%C前面加空格是为了起间隔作用 scanf不读入空格
	sepect(b,&m,ch); 
	if(m) 
		printf("sepect : %c \n",m->data);
	else 
		printf("Error,no this data: %c\n",ch);
	//继续则输入 1,退出输入 0
	printf("continue input 1,break input 0:\n");
	scanf("%d",&t);  
	}
}
