您的位置:

普通树的深度遍历c语言,树的层次遍历c语言

本文目录一览:

C语言用三种不同的方法遍历二叉树并用两种方式排序

以下是我的数据结构实验的作业:肯定好用,里面还包括了统计树的深度和叶子数!记住每次做完一个遍历还要重新输入你的树哦!

#include "stdio.h"

#include "string.h"

#define NULL 0

typedef struct BiTNode{

char data;

struct BiTNode *lchild,*rchild;

}BiTNode,*BiTree;

BiTree Create(BiTree T){

char ch;

ch=getchar();

if(ch=='#')

T=NULL;

else{

if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))

printf("Error!");

T-data=ch;

T-lchild=Create(T-lchild);

T-rchild=Create(T-rchild);

}

return T;

}

void Preorder(BiTree T){

if(T){

printf("%c",T-data);

Preorder(T-lchild);

Preorder(T-rchild);

}

}

int Sumleaf(BiTree T){

int sum=0,m,n;

if(T){

if((!T-lchild)(!T-rchild))

sum++;

m=Sumleaf(T-lchild);

sum+=m;

n=Sumleaf(T-rchild);

sum+=n;

}

return sum;

}

void zhongxu(BiTree T){

if(T){

zhongxu(T-lchild);

printf("%c",T-data);

zhongxu(T-rchild);

}

}

void houxu(BiTree T){

if(T){

houxu(T-lchild);

houxu(T-rchild);

printf("%c",T-data);

}

}

int Depth(BiTree T){

int dep=0,depl,depr;

if(!T) dep=0;

else{

depl=Depth(T-lchild);

depr=Depth(T-rchild);

dep=1+(depldepr?depl:depr);

}

return dep;

}

main(){

BiTree T;

int sum,dep;

T=Create(T);

Preorder(T);

printf("\n");

zhongxu(T);

printf("\n");

houxu(T);

printf("\n");

sum=Sumleaf(T);

printf("%d",sum);

dep=Depth(T);

printf("\n%d",dep);

}

在Turbo C的环境下,先按Ctrl+F9运行程序,此时就是建立二叉树的过程,例如输入序列ABC##DE#G##F###(其中的“#”表示空,并且输入过程中不要加回车,因为回车也有对应的ASCII码,是要算字符的,但是输入完之后可以按回车退出),然后再按ALT+F5显示用户界面,这时候就能够看到结果了。

另外你必须会手动建立一棵二叉树,保证你输入的序列能构成一棵二叉树,否则你怎么输入,按最后按多少回车程序也不会结束!

C语言创建二叉树 遍历 求深度 求解!!

测试结果:

At the first,we create a tree

Please input nodes of tree

a

b

c

#

#

d

e

#

g

#

#

f

#

#

#

abcdegf

cbegdfa

cgefdba

The count of leaves is: 3

The height of tree is 5

请按任意键继续. . .

【楼主】 建树的函数是一个递归的过程

我上面测试的这颗树

a

/

b

/ \

c d

/ \

e f

\

g

仔细看我的建树的时候的输入!

为了测试上面的5个函数,我把case去掉了。你补上去!

【你的CreateBinTree()】是没有参数的,所以你后面的申明不能带参数

测试代码:

#includestdio.h

#includestdlib.h

typedef struct bnode{

char data;

struct bnode *lchild;

struct bnode *rchild;

}*BTree,Bnode;

BTree CreateBinTree()

{

char ch;

BTree t;

ch=getchar();

getchar();

if(ch=='#')

t=NULL;

else

{

t=(BTree)malloc(sizeof(Bnode));

t-data=ch;

t-lchild=CreateBinTree();

t-rchild=CreateBinTree();

}

return t;

}

void PreOrder(BTree t)

{

if(t)

{

printf("%c",t-data);

PreOrder(t-lchild);

PreOrder(t-rchild);

}

}

void InOrder(BTree t)

{

if(t)

{

InOrder(t-lchild);

printf("%c",t-data);

InOrder(t-rchild);

}

}

void PostOrder(BTree t)

{

if(t)

{

PostOrder(t-lchild);

PostOrder(t-rchild);

printf("%c",t-data);

}

}

int Height(BTree t)

{

int h1,h2;

if(t==NULL)

return 0;

else

{

h1=Height(t-lchild);

h2=Height(t-rchild);

if(h1h2)

return h1+1;

else

return h2+1;

}

}

int LeafCount(BTree t)

{

int count1,count2;

if(t==NULL)

return 0;

else

{

if(t-lchild==NULLt-rchild==NULL)

return 1;

else

{

count1=LeafCount(t-lchild);

count2=LeafCount(t-rchild);

return count1+count2;

}

}

}

main()

{ BTree root;/*定义指向树的指针*/

int t=1;

printf("At the first,we create a tree\n");

printf("Please input nodes of tree\n");

root=CreateBinTree();//调用函数创建树

if (root==NULL) printf("It's an empty tree!\n");

else

{

PreOrder(root); printf("\n");

InOrder(root); printf("\n");

PostOrder(root); printf("\n");

printf("\nThe count of leaves is: %d \n",LeafCount(root));

printf("\nThe height of tree is %d \n",Height(root));

system("pause");

}

}

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=hlhr? hl:hr; //取左右深度的最大值

NodeNum=NodeNum+1; //求结点数

if(hl==0hr==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,求出该树的结点数。

printf("\t0: 退出\n");

printf("\t*******************************\n");

scanf("%d",i);

//输入菜单序号(0-5)

switch(i)

{

case 1: {printf("Print Bin_tree Preorder: ");

Preorder(root); //先序遍历

}break;

case 2: {printf("Print Bin_Tree Inorder: ");

Inorder(root); //中序遍历

}break;

case 3: {printf("Print Bin_Tree Postorder: ");

Postorder(root); //后序遍历

}break;

case 4: {depth=TreeDepth(root); //求树的深度及叶子数

printf("树深=%d 树总结点数=%d",depth,NodeNum);

printf(" 树叶子数=%d",leaf);

}break;

case 5: {printf("LevePrint Bin_Tree: ");

Levelorder(root); //按层次遍历

}break;

default: exit(1);

}

}while(i=0i6);

}

兄弟你看看 不懂再往下留言 记得给我的劳动成果一点点奖励哦!!

C语言二叉树遍历程序

先看下creat这个函数:

status creat(bitnode *t)/*先序建立二叉树*/

{

char ch;

ch=getch();putch(ch);

if(ch=='0') t=NULL;

else

{

t=(bitnode *)malloc(sizeof(bitnode));

if(!t)

exit(OVERFLOW);

t-data=ch;

creat(t-lchild);

creat(t-rchild);

}

return OK;

}

其中有句代码是t=(bitnode *)malloc(sizeof(bitnode));

这是给t赋值,由于t是参数,这样做是不能返回的。

我知道你的意思是想通过指针返回,但是那样的用法应该是对t所指向的变量赋值,也就是对*t赋值。

如果你还没理解的话看下函数里的递归调用:creat(t-lchild);调用函数后,本意是要给t-lchild赋值的,但是是做不到的,因为要改变一个变量的值的话,应该传的是它的地址。

可能你觉得有点乱了,我举个函数中用指针做参数来返回的例子:

假如要用指针返回一个整型的变量,那么指针应该是指向整型变量的,即int*

这里应该是要返回一个struct bitnode *类型的,也就是返回的值就是个指针,那么参数就应该是一个指向这种指针的指针,即struct bitnode **

可以这么修改:

status creat(bitnode **t) //多了个*

{

char ch;

ch=getch();putch(ch);

if(ch=='0') *t=NULL; //多了个*

else

{

*t=(bitnode *)malloc(sizeof(bitnode)); //多了个*

if(!*t) //多了个*

exit(OVERFLOW);

(*t)-data=ch;

creat((*t)-lchild); //注意不同

creat((*t)-rchild);

}

return OK;

}

主函数这么改

status main()

{

bitnode* t1; //多了个*

creat(t1);

pre(t1,print); //少了个

getch();

return 0;

}

另外一个编译错误就是

int pre(bitnode *t,status (*visit)())

指针函数后面应该带参数,改为

int pre(bitnode *t,status (*visit)(bitnode *))

C语言 树的生成和遍历

#include //头文件

#include

typedef struct BiTNode

{

char data;

struct BiTNode *lchild,*rchild;

}

BiTNode,*BiTree;//定义结点类型

BiTree CreateBiTree()//创建树

{

char p;BiTree T;

scanf("%c",p);

if(p==' ')

T=NULL;

else

{

T=(BiTNode *)malloc(sizeof(BiTNode));//为结点开辟空间

T-data=p;

T-lchild=CreateBiTree();

T-rchild=CreateBiTree();

}

return (T);

}

void PreOrder(BiTree T)//先序

{

if(T!=NULL)

{

printf("%c",T-data);

PreOrder(T-lchild);

PreOrder(T-rchild);

}

}

void InOrder(BiTree T)//中序

{

if(T!=NULL)

{

InOrder(T-lchild);

printf("%c",T-data);

InOrder(T-rchild);

}

}

void PostOrder(BiTree T)//后序

{

if(T!=NULL)

{

PostOrder(T-lchild);

PostOrder(T-rchild);

printf("%c",T-data);

}

}

void main()//主函数

{

BiTree Ta;

Ta=CreateBiTree();

printf("先序遍历:");

printf("\n");

PreOrder(Ta);

printf("\n");

printf("中序遍历:");

printf("\n");

InOrder(Ta);

printf("\n");

printf("后序遍历:");

printf("\n");

PostOrder(Ta);

}

给你个简单的例子:

AB***

其中*代表空格

复杂点的例子

ABC**DE*f**g***

其中*代表空格

普通树的深度遍历c语言,树的层次遍历c语言

2023-01-04
输出二叉树的层次遍历c语言,遍历二叉树C语言

2023-01-04
层次遍历构建二叉树c语言,c语言二叉树的创建与遍历

2023-01-06
c语言深度优先二叉树遍历,深度优先遍历类似于二叉树的层次遍历

本文目录一览: 1、急急急!求C语言的数据结构二叉树递归遍历程序! 2、C语言二叉树的遍历。 3、C语言数据结构“遍历二叉树” 4、二叉树的创建和遍历 急急急!求C语言的数据结构二叉树递归遍历程序!

2023-12-08
c语言中前序遍历,先序遍历c语言

2022-12-01
二叉树的前序遍历c语言,二叉树前序遍历c语言代码

2022-11-25
c语言遍历含义,c语言怎么遍历

2022-11-30
c语言层序遍历创建二叉树,二叉树的建立与遍历完整代码C语言

2022-11-23
c语言求二叉树最大深度,c语言求二叉树高度

2022-11-25
后序遍历二叉树的递归算法c语言,实现二叉树的后序遍历的非递归

2023-01-03
c语言广度遍历,广度遍历深度遍历

2022-11-24
以图判树c语言,c语言关于树的算法

2023-01-05
二叉树按层输出c语言,C语言二叉树怎么输入数据

2022-11-24
栈的遍历c语言,c语言栈的用法

2023-01-07
遍历c语言编程,遍历数组c语言

2022-11-30
数据结构c语言二叉树的查找,数据结构c语言版二叉树代码

2022-11-22
c语言实现文件遍历,c语言遍历文件内容

2022-11-27
c语言八叉树,二叉树构造c语言实现

2022-11-26
二叉树层序遍历递归python(递归层次遍历二叉树)

2022-11-16
关于c语言实现后序非递归遍历,前序遍历非递归实现

2022-11-24