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;
}