普通树的深度遍历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***

其中*代表空格

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/300769.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-29 12:52
下一篇 2024-12-29 12:52

相关推荐

  • AES加密解密算法的C语言实现

    AES(Advanced Encryption Standard)是一种对称加密算法,可用于对数据进行加密和解密。在本篇文章中,我们将介绍C语言中如何实现AES算法,并对实现过程进…

    编程 2025-04-29
  • 学习Python对学习C语言有帮助吗?

    Python和C语言是两种非常受欢迎的编程语言,在程序开发中都扮演着非常重要的角色。那么,学习Python对学习C语言有帮助吗?答案是肯定的。在本文中,我们将从多个角度探讨Pyth…

    编程 2025-04-29
  • Python遍历集合中的元素

    本文将从多个方面详细阐述Python遍历集合中的元素方法。 一、for循环遍历集合 Python中,使用for循环可以遍历集合中的每个元素,代码如下: my_set = {1, 2…

    编程 2025-04-29
  • Python被称为胶水语言

    Python作为一种跨平台的解释性高级语言,最大的特点是被称为”胶水语言”。 一、简单易学 Python的语法简单易学,更加人性化,这使得它成为了初学者的入…

    编程 2025-04-29
  • Python如何遍历字典中的key和value

    本文将详细讲解Python中如何遍历字典中的key和value,包括多种遍历方式以及在遍历过程中的一些应用场景。 一、遍历字典中的key和value 在Python中,字典是一种无…

    编程 2025-04-29
  • OpenJudge答案1.6的C语言实现

    本文将从多个方面详细阐述OpenJudge答案1.6在C语言中的实现方法,帮助初学者更好地学习和理解。 一、需求概述 OpenJudge答案1.6的要求是,输入两个整数a和b,输出…

    编程 2025-04-29
  • Python按位运算符和C语言

    本文将从多个方面详细阐述Python按位运算符和C语言的相关内容,并给出相应的代码示例。 一、概述 Python是一种动态的、面向对象的编程语言,其按位运算符是用于按位操作的运算符…

    编程 2025-04-29
  • 深度查询宴会的文化起源

    深度查询宴会,是指通过对一种文化或主题的深度挖掘和探究,为参与者提供一次全方位的、深度体验式的文化品尝和交流活动。本文将从多个方面探讨深度查询宴会的文化起源。 一、宴会文化的起源 …

    编程 2025-04-29
  • Python语言由荷兰人为中心的全能编程开发工程师

    Python语言是一种高级语言,很多编程开发工程师都喜欢使用Python语言进行开发。Python语言的创始人是荷兰人Guido van Rossum,他在1989年圣诞节期间开始…

    编程 2025-04-28
  • Python语言设计基础第2版PDF

    Python语言设计基础第2版PDF是一本介绍Python编程语言的经典教材。本篇文章将从多个方面对该教材进行详细的阐述和介绍。 一、基础知识 本教材中介绍了Python编程语言的…

    编程 2025-04-28

发表回复

登录后才能评论