c语言实现二叉树遍历
‘壹’ c语言实现二叉树先序遍历
你铁定是哈工大
‘贰’ 二叉树遍历(c语言实现)
#include <stdio.h>
#include <malloc.h>
typedef struct node{ 
int data; 
struct node *lchild,*rchild; 
}*treetp,tree; 
treetp create (treetp t,int c); 
void print1(treetp); 
void print2(treetp);
void print3(treetp);
int number=0;
void main() 
{
  treetp t=0,r; 
  r=create (t,0); 
  printf("前序排列 :");
  print1  (r); 
  printf("\n中序排列 :");
  print2 (r);
  printf("\n后序排列 :");
  print3 (r);
} 
treetp  create(treetp t,int c) 
{ 
treetp p,di; 
do{ 
scanf("%d",&c); 
if (t==0) 
 { 
 t=(treetp)malloc(sizeof(tree)); 
 t->lchild=t->rchild=0; 
 t->data=c; 
 } 
else 
 {   p=t; 
  while(p!=0) 
  { 
  di=p; 
  if(c<(p->data)) 
  p=p->lchild; 
  else 
  p=p->rchild; 
  } 
if(c<(di->data)) 
{ 
treetp NEWdi=(treetp) malloc(sizeof(tree)); 
NEWdi->lchild=NEWdi->rchild=0; 
NEWdi->data=c; 
di->lchild=NEWdi; 
} 
else 
{ 
treetp NEWdi=(treetp) malloc(sizeof(tree)); 
NEWdi->lchild=NEWdi->rchild=0; 
NEWdi->data=c; 
di->rchild=NEWdi; 
} 
 } 
++number;
}while(c!=0); 
printf("叶子的数量:%d",number);
return t;
}   
void print1(treetp  t) 
{ 
   if (t!=0) 
  {     
   printf("%d ",t->data);
   print1(t->lchild); 
   print1(t->rchild); 
   } 
} 
void print2(treetp  t) 
{ 
   if (t!=0) 
  {     
   print2(t->lchild); 
   printf("%d ",t->data); 
   print2(t->rchild); 
   } 
} 
void print3(treetp  t) 
{ 
   if (t!=0) 
  {     
   print3(t->lchild);  
   print3(t->rchild); 
   printf("%d ",t->data);
   } 
} 
希望对你有帮助
‘叁’ 求二叉树遍历算法C语言实现的
Status
PreOrderTraverse
(
BiTree
T,
Status
(
*Visit
)
(
TElemType
e
)
)
{
//
采用二叉链表存储结构,Visit
是对数据元素操作的应用函数,先序遍历二叉树
T
的递归算法。
if
(
T
)
{
//
若
T
不为空
if
(
Visit
(
T->data
)
)
//
调用函数
Visit
if
(
PreOrderTraverse
(
T->lchild,
Visit
)
)
//
递归调用左子树
if
(
PreOrderTraverse
(
T->rchild,
Visit
)
)
return
OK;
//
递归调用右子树
return
ERROR;
}
else
return
OK;
}
//
PreOrderTraverse
‘肆’ 用c语言实现二叉树的层次遍历(用非递归方法)
使用队列,每出一个节点,将该节点的子节点入队。so easy
‘伍’ 二叉树的建立与遍历(C语言)
楼主你好~~~“ф”字符的源代码我忘记了,我这里有一个自己写过的遍历算法
#include<iostream.h>
typedef struct btnode
{
 char data;
 struct btnode *Lchild,*Rchild;
}*bitreptr;
void Create(bitreptr &p)
{
 char n;
 p=new btnode;
 cin>>n;
 if(n!='#')
 {
   p->data=n;
   Create(p->Lchild);
   Create(p->Rchild);
 }
 else
  p=NULL;
 
}
void preorder(bitreptr &p)
{
 if(p)
 {
  cout<<p->data<<" ";
  preorder(p->Lchild);
  preorder(p->Rchild);
 }
}
void midorder(bitreptr &p)
{
 if(p)
 {
  midorder(p->Lchild);
  cout<<p->data<<" ";
  midorder(p->Rchild);
 }
}
void postorder(bitreptr &p)
{
 if(p)
 {
  postorder(p->Lchild);
  postorder(p->Rchild);
  cout<<p->data<<" ";
 }
}
void change(bitreptr &p)
{
 bitreptr t,q;
 if(p)
 {
  t=p->Lchild;
  q=p->Rchild;
  p->Lchild=q;
  p->Rchild=t;
  change(p->Lchild);
  change(p->Rchild);
 }
}
void main()
{
 char i;
 cout<<"请选择所需功能('A'输出该二叉树序列,'B'输出交换后二叉树序列)"<<endl;
 cin>>i;
 bitreptr p;
 cout<<"输入数据:";
 Create(p);
 switch(i)
 {
    case 'A':
  {
         cout<<"前序:";
         preorder(p);
         cout<<endl;
         cout<<"中序:";
         midorder(p);
         cout<<endl;
         cout<<"后序:";
         postorder(p);
         cout<<endl;
  }break;
 case 'B':
  {
   change(p);
   cout<<"交换二叉树前序:";
         preorder(p);
         cout<<endl;
         cout<<"交换二叉树中序:";
         midorder(p);
         cout<<endl;
         cout<<"交换二叉树后序:";
         postorder(p);
         cout<<endl;
  }break;
 }
}
这个算法输入时要以“#”代表空节点,及将[测试数据]  “ABCффDEфGффFффф”改成“ABC##DE#G##F###”即可。另外我的算法包括了二叉树左右子树交换的代码“change(bitreptr &p)”,只要楼主稍作修改就可以得到你想要的完美结果~
‘陆’ C语言二叉树遍历
你这个二叉树是根据什么遍历排列的,你没说清楚啊?
‘柒’ 遍历二叉树的实现(C语言)帮忙啊......
#include <stdio.h>
#include <stdlib.h>
#include<iostream.h>
#define maxnode 100
#define NULL  0
typedef char DataType; /*设数据域类型为字符型*/
typedef struct node{
      DataType data;
      struct node *lchild,*rchild; /*左右链域为指向结点结构的指针类型*/
}bintnode; /*结点类型*/
typedef bintnode *bintree; /*指向二叉树结点的指针类型*/
void createbintree(bintree  *T);  /*构造二叉链表*/
void Preorder(bintree T);   /*先序*/
void inorderout(bintree T); /*中序*/
void Postorder(bintree T);  /*后序*/
void LevelOrder(bintree T); /*按层次遍历二叉树T*/
/*以加入结点的先序序列输入,构造二叉链表*/
void createbintree(bintree  *T)
{
 char ch;
 scanf("\n%c",&ch);
 if(ch=='0')*T=NULL;
 else
 {
  *T=(bintnode*)malloc(sizeof(bintnode));
  (*T)->data=ch;
  createbintree(&(*T)->lchild);
  createbintree(&(*T)->rchild);
 }
}
/*先序遍历二叉树T*/
void Preorder(bintree T)
{
     if (T)
  {
   cout<<T->data; /*访问结点数据*/
         Preorder(T->lchild); /*先序遍历二叉树T的左子树*/
         Preorder(T->rchild); /*先序遍历二叉树T的右子树*/
  }
}
/*中序遍历二叉树T*/
void inorderout(bintree T)
{
 if(T)
 {
  inorderout(T->lchild);  /*中序遍历二叉树T的左子树*/
  cout<<T->data;  /*访问结点数据*/
  inorderout(T->rchild);  /*中序遍历二叉树T的右子树*/
 }
}
/*后序遍历二叉树T*/
void Postorder(bintree T)
{
    if (T)
 {
  Postorder(T->lchild);  /*后序遍历二叉树T的左子树*/
        Postorder(T->rchild);  /*后序遍历二叉树T的右子树*/
        cout<<T->data; /*访问结点数据*/
 }
}
void LevelOrder(bintree bt)
{
 bintree queue[maxnode];
 int front,rear;
 if (bt==0)return;
 front=-1;    /*队列初始化*/
 rear=0;
 queue[rear]=bt;  /*根结点入队*/
 while(front!=rear)
 {
  front++;
  cout<<queue[front]->data;       /*访问队首结点的数据域*/
  if(queue[front]->lchild!=NULL)  /*将队首结点的左孩子结点入队列*/
  {
   rear++;
   queue[rear]=queue[front]->lchild;
  }//if
  if(queue[front]->rchild!=NULL)  /*将队首结点的右孩子结点入队列*/
  {
   rear++;
   queue[rear]=queue[front]->rchild;
  }//if
 }//while
}//LevelOrder
void main()
{
 bintree T;
    char a,b;
    cout<<"欢迎进入二叉树基本操作测试程序,请选择:"<<endl;
    a='y';
    while(a=='y' || a=='Y')
 {
      cout<<"1-------------------------二叉树建立"<<endl;
         cout<<"2-------------------------先序遍历!"<<endl;
         cout<<"3-------------------------中序遍历!"<<endl;
         cout<<"4-------------------------后序遍历!"<<endl;
         cout<<"5-------------------------层次遍历!"<<endl;
         cout<<"6-------------------------退出!"<<endl;
         cin>>b;
         switch(b)
   {
               case '1': cout<<"请按带空指针的二叉树先序输入建立二叉树存储的结点序列:"<<endl;
                         createbintree(&T);cout<<endl;break;
               case '2': cout<<"该二叉树的先根序遍历序列为:"<<endl;
                         Preorder(T);cout<<endl;break;
               case '3':cout<<"该二叉树的中根遍历序列为:"<<endl;
                        inorderout(T);cout<<endl;break;
               case '4':cout<<"该二叉树的后根遍历序列为:"<<endl;
                        Postorder(T);cout<<endl;break;
               case '5':cout<<"该二叉树的层次遍历序列为:"<<endl;
                        LevelOrder(T);cout<<endl;break;
               case '6':a='n';break;
               default:a='n';
   }//switch
 }//while
}//main
‘捌’ 怎么用c语言实现二叉树的遍历
这是用广义表建立二叉树并先序和中序遍历二叉树
#include <stdio.h>
 #include <stdlib.h>
 #define MaxSize 100
 typedef struct node
  {
     char data;
     struct node *lchild;
     struct node *rchild;
  }BTNode,*BiTree;
  void creategeneralizelist(BiTree *b,char *str)
   {
      BTNode *St[MaxSize],*p=NULL;
      int top=-1,flag,j;
      char ch;
      for(j=0;(ch=str[j])!='#';j++)
        {
          switch(ch)
           {
             case '(':
               top++;
               St[top]=p;
               flag=1;
               break;
             case ')':
               top--;
               break;
             case ',':
               flag=2;
               break;
             default:
               p=(BiTree)malloc(sizeof(BTNode));
               p->data=ch;
               p->lchild=NULL;
               p->rchild=NULL;
             if(*b==NULL)
               *b=p;
             else
             {
               switch(flag)
               {
                case 1:
                  St[top]->lchild=p;
                  break;
                case 2:
                  St[top]->rchild=p;
                  break;
               }
             }
           }
         }
    }
void PreOrder(BiTree T)
     {
        if(T)
          {
             printf("%2c",T->data);
             PreOrder(T->lchild);
             PreOrder(T->rchild);
          }
     }
   void InOrder(BiTree T)
     {
       if(T)
        {
          InOrder(T->lchild);
          printf("%2c",T->data);
          InOrder(T->rchild);
        }
     }
int main(void)
      {
         BiTree T=NULL;
         char str[MaxSize];/*用于保存用户输入的字符*/
         printf("please input a string end with #:\n");
         scanf("%s",str);
         creategeneralize_list(&T,str);
         printf("the result ofInOrder BiTree is:\n");
         /* PreOrder(T);*/
         InOrder(T);
         getch();
         return 1;
      }
‘玖’ C语言二叉树的创建和遍历
我写了一个二叉树
  你给看看
一定能行的
 我自己用了
 #include "stdio.h"
 #include "malloc.h"
 #include "string.h"
 #include "stdlib.h"
 #define Max 20
  
 //结点的最大个数
 typedef struct BinTNode{
  
char data;
  
struct BinTNode *lchild,*rchild;
 }BinTNode,*BinTree;
  
    //自定义二叉树的结点类型
    //定义二叉树的指针
 int NodeNum,leaf;
  
    //NodeNum为结点数,leaf为叶子数
  
//==========以广义表显示二叉树==============
 void DisTree(BinTree T)
 {
  if(T)
  {
   printf("%c",T->data);
   if((T->lchild)||(T->rchild))
   {
    if(T->lchild)
    {
  
  printf("%c",'(');
  
  DisTree(T->lchild);
    }
  
  if(T->rchild)
    {
  
  printf("%c",',');
  
  DisTree(T->rchild);
  
  printf("%c",')');
    }
   }
  }
 }
 //==========基于先序遍历算法创建二叉树==============
 //=====要求输入先序序列,其中加入虚结点"#"以示空指针的位置==========
 BinTree CreatBinTree(BinTree T)
 {
  
char ch;
   ch=getchar();
   if(ch=='#')
    T=NULL;
   else
  {
    if(!(T=(BinTNode *)malloc(sizeof(BinTNode))))
  
printf("Error!");
    T->data=ch;
    T->lchild=CreatBinTree(T->lchild);
    T->rchild=CreatBinTree(T->rchild);
   }
   return T;
   }
 //========NLR 先序遍历=============
 void Preorder(BinTree T)
 {
    if(T)
  {
    printf("%c",T->data);
   Preorder(T->lchild);
   Preorder(T->rchild);
   }
  }
 //========LNR 中序遍历===============
 void Inorder(BinTree T)
 {
    if(T){
   Inorder(T->lchild);
   printf("%c",T->data);
   Inorder(T->rchild);
  }
  }
 //==========LRN 后序遍历============
 void Postorder(BinTree T)
 {
    if(T){
   Postorder(T->lchild);
   Postorder(T->rchild);
   printf("%c",T->data);
  }
  }
 //=====采用后序遍历求二叉树的深度、结点数及叶子数的递归算法========
 int TreeDepth(BinTree T)
 {
  
int hl,hr,max;
  
if(T){
  
 hl=TreeDepth(T->lchild);
 //求左深度
   hr=TreeDepth(T->rchild);
 //求右深度
  
 max=hl>hr? hl:hr;
  
   //取左右深度的最大值
   NodeNum=NodeNum+1;
  
 //求结点数
  if(hl==0&&hr==0)
   leaf=leaf+1;  //若左右深度为0,即为叶子。
   return(max+1);
  
} 
    else return(0);
 }
 //====利用"先进先出"(FIFO)队列,按层次遍历二叉树==========
 void Levelorder(BinTree T)
 {
  
int front=0,rear=1;
  
BinTNode *cq[Max],*p;
//定义结点的指针数组cq
  
cq[1]=T;
//根入队
  
while(front!=rear)
{
   front=(front+1)%NodeNum;
   p=cq[front];
  
    //出队
   printf("%c",p->data);
  //出队,输出结点的值
    if(p->lchild!=NULL){
  
 rear=(rear+1)%NodeNum;
  
  cq[rear]=p->lchild;
  //左子树入队
   }
   if(p->rchild!=NULL){
  
 rear=(rear+1)%NodeNum;
  
  cq[rear]=p->rchild;
  //右子树入队
  }
  
} 
} 
//==========主函数=================
 void main()
 {
  
BinTree T,root;
  
int i,depth;
  
printf("\n");
  
printf("输入完全二叉树的先序序列:"); //输入完全二叉树的先序序列,
// 用#代表虚结点,如ABD###CE##F##
  
root=CreatBinTree(T);
    //创建二叉树,返回根结点
  
DisTree(root);
  printf("\n");
  do
//从菜单中选择遍历方式,输入序号。
  {
   printf("\t********** 菜单 ************\n");
  
 printf("\n");
  
 printf("\t1: 先序遍历\n");
  
  printf("\t2: 中序遍历\n");
  
 printf("\t3: 后序遍历\n");
   printf("\t4: 该树的深度,结点数,叶子数\n");
  
 printf("\t5: 层次遍历\n"); //按层次遍历之前,先选择4,求出该树的结点数。
  
 p
‘拾’ c语言 二叉树的遍历
//---------------------------------------------------------------------------
#include<iostream> 
using namespace std;
typedef struct node
{
 struct node *L,*R;
 string name;
}NODE;
//输入
void Input(NODE **T,int num)
{
   string name;
   int L,R;
   *T = new NODE[num];
   for (int i=0;i<num;)
   {
     cout << "输入第"<<i+1<<"个结点名称、左右子序号:"<<endl;
     cin >> name >> L >> R;
     if(L >=num || R >=num)
     {
       cout << "输入结点序号非法,请重新输入"<<endl;
       continue;
     }
     (*T+i)->name = name;
     (*T+i)->L =  L==-1? NULL:*T+L;
     (*T+i)->R =  R==-1? NULL:*T+R;
     i++;
   }
}
//前序
void NLR(NODE *T)
{
  if(T==NULL)return ;
  cout <<T->name<<" ";
  NLR(T->L);
  NLR(T->R);
}
//中序
void LNR(NODE *T)
{
  if(T==NULL)return ;
  NLR(T->L);
  cout <<T->name<<" ";
  NLR(T->R);
}
//后序
void LRN(NODE *T)
{
  if(T==NULL)return ;
  NLR(T->L);
  NLR(T->R);
  cout <<T->name<<" ";
}
int main()
{
   NODE *T=NULL,t;
   int num;
   cout << "输入结点数:"<<endl;
   cin >> num;
   Input(&T,num);
   cout <<"前序:";
   NLR(T);
   cout << endl;
   cout <<"中序:";
   LNR(T);
   cout << endl;
   cout <<"后序:";
   LRN(T);
   cout << endl;
   system("PAUSE");
   return 0;
}
