#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
#include "string.h"
typedef char DataType;
//前序输入的测试数据 data ABC***DE*G**F**
//定义二叉树结构体类型
typedef struct btree
{
DataType data;
struct btree *lchild,*rchild;
}BTree,*PTree;
/*层次化初始二叉树 比较牛,PS:层次化输出参考图的广度优先遍历算法*/
void levelCreateBTree(PTree *t,char *v,int i,int l)
{
if(i>l)*t=NULL;
else{
*t = (PTree)malloc(sizeof(BTree));
(*t)->data=v[i];
levelCreateBTree(&(*t)->lchild,v,i*2+1,l);
levelCreateBTree(&(*t)->rchild,v,i*2+2,l);
}
}
//二叉树前序输入初始化
void preCreateBTree(PTree *t)
{
char c;
c=getchar();
if(c=='*')
{
*t=NULL;return;
}
*t=(PTree)malloc(sizeof(BTree));
(*t)->data=c;
preCreateBTree(&((*t)->lchild));
preCreateBTree(&((*t)->rchild));
}
//二叉树前序后序输入初始化 // 测试数据 abdg cefh dgba echf
//pre 前序输入字符串 pres 前序起始长度 pree 前序终止长度 in 中序输入字符串 ins 中序起始长度 ine 中序终止长度
void preInCreateBTree1(PTree *t,char *pre,int pres,int pree,char *in,int ins,int ine)
{
int i;
if(pres>pree||ins>ine)
{
*t=NULL;
}else
{
*t=(PTree)malloc(sizeof(BTree));
(*t)->data=pre[pres];
for(i=ins;i<=ine;i++)
{
if(in[i]==pre[pres])
{
preInCreateBTree1(&(*t)->lchild,pre,pres+1,pres+i-ins,in,ins,i-1);
preInCreateBTree1(&(*t)->rchild,pre,pres+i-ins+1,pree,in,i+1,ine);
break;
}
}
}
}
//二叉排序树初始化
void insertBST(PTree *t,int c)
{
PTree f,p;
p=(*t);
//判定输入值存在的同时,找到数据插入的位置
while(p!=NULL)
{
printf("p->data=%d\n",p->data);
printf("c=%d\n",c);
if(p->data==c)
{
printf("输入的值已经存在!\n");return;
}
f=p;
//递归到最后p是一空值 f为其父节点
p=(c<p->data)?p->lchild:p->rchild;
}
p=(PTree)malloc(sizeof(BTree));
p->data=c;
p->lchild=NULL;p->rchild=NULL;//比较关键
if(*t==NULL)
{
*t=p;
}else
{
if(c<f->data)
{
f->lchild=p;
}else
{
f->rchild=p;
}
}
}
void createBST(PTree *t)
{
int d;
scanf("%d",&d);
if(d==-9999)return;
do{
insertBST(t,d);
scanf("%d",&d);
}while(d!=-9999);
}
/*二叉排序树*/
void BST(PTree *t)
{
int c;
PTree f,p;
scanf("%d",&c);
if(c==-9999)return;//判定输入
do
{
//判定输入值存在的同时,找到数据插入的位置
p=(*t);//归位
while(p!=NULL)
{
if(p->data==c)
{
printf("输入的值已经存在!\n");return;
}
f=p;
//递归到最后p是一空值 f为其父节点
p=(c<p->data)?p->lchild:p->rchild;
}
p=(PTree)malloc(sizeof(BTree));
p->data=c;
p->lchild=NULL;p->rchild=NULL;
if(*t==NULL)
{
*t=p;
}else
{
if(c<f->data)
{
f->lchild=p;
}else
{
f->rchild=p;
}
}
scanf("%d",&c);
}while(c!=-9999);
}
//二叉树前序遍历
void preOrder(PTree t)
{
if(t==NULL)return;
printf("%c",t->data);
preOrder(t->lchild);
preOrder(t->rchild);
}
//二叉树中序遍历
void inOrder(PTree t)
{
if(t==NULL)return;
inOrder(t->lchild);
printf("%c",t->data);
inOrder(t->rchild);
}
//二叉树后序遍历
void postOrder(PTree t)
{
if(t==NULL)return;
postOrder(t->lchild);
postOrder(t->rchild);
printf("%c",t->data);
}
//求叶子节点数
int leafNum(PTree t)
{
int l,r;
if(!t)return 0;
else if(t->lchild==NULL&&t->rchild==NULL) return 1;//判定叶子
else
{
l=leafNum(t->lchild);
r=leafNum(t->rchild);
return l+r;
}
}
//求二叉树中叶子结点的个数
int nodeNum(PTree t)
{
int l,r;
if(t==NULL)return 0;//空树没有叶子节点
else if(t->lchild==NULL&&t->rchild==NULL) return 1;//判定叶子(只有一个根结点)
else
{
l=nodeNum(t->lchild);
r=nodeNum(t->rchild);
return l+r+1;
}
}
//求二叉树中度为2的结点数
int node2Num(PTree t)
{
if(t==NULL)return 0;
else
{
if(t->lchild&&t->rchild)return 1+node2Num(t->lchild)+node2Num(t->rchild);
else
{
if(t->lchild&&!t->rchild)return node2Num(t->lchild);
else return node2Num(t->rchild);
}
}
}
//度为1的结点数
int node1Num(PTree t)
{
if(t==NULL)return 0;
if((t->lchild!=NULL&&t->rchild==NULL)||(t->lchild==NULL&&t->rchild!=NULL))return 1;//判定度为1结点
return node1Num(t->lchild)+node1Num(t->rchild);
}
//求高度(深度)根节点深度为1
int height(PTree t)
{
int l,r;
if(t==NULL)return 0;
else if(t->lchild==NULL&&t->rchild==NULL) return 1;//判定叶子
else
{
l=height(t->lchild);
r=height(t->rchild);
return (l>r?l:r)+1;
}
}
//交换二叉树的左右子树
void exchangeBtree(PTree t)
{
PTree temp;
if(t)
{
temp=t->lchild;
t->lchild=t->rchild;
t->rchild=temp;
exchangeBtree(t->lchild);
exchangeBtree(t->rchild);
}
}
void main()
{
PTree p=NULL;
int i,l;
char a[100],b[100];
// 前序中序输入测试
printf("前序输入:\n");
gets(a);
l=strlen(a);
levelCreateBTree(&p,a,0,l-1);
// printf("中序输入:\n");
// gets(b);
// preInCreateBTree1(&p,a,0,strlen(a)-1,b,0,strlen(b)-1);*/
// preCreateBTree(&p);
// createBST(&p);
// BST(&p);
printf("层次输出:\n");
levelOutputBtree(p,0);
/* printf("前序输出:\n");
preOrder(p);
printf("\n");
printf("中序输出:");
inOrder(p);
printf("\n");
printf("后续输出:");
postOrder(p);
printf("\n");
printf("树的高度为:%d\n",height(p));
printf("节点数为:%d\n",nodeNum(p));
printf("度为1结点数:%d\n",node1Num(p));
printf("度为2结点数:%d\n",node2Num(p));
printf("叶子节点数为:%d\n",leafNum(p));
exchangeBtree(p);
printf("交换后后续输出:");
postOrder(p);
*/
}
分享到:
相关推荐
本代码示例不仅展示了如何在VC环境下调试和运行C语言程序,更重要的是,它提供了一个实用的框架,帮助学习者理解和实践二叉树的重建算法。对于希望深入了解数据结构和算法的开发者来说,这是一个宝贵的资源。
在IT领域,C语言是一种基础且强大的编程语言,尤其适合实现数据结构和算法。本主题聚焦于使用C语言实现二叉树...在"压缩包子文件的文件名称列表"中的"C_二叉树"可能包含了具体的代码实现,可以作为学习和参考的实例。
本篇将详细讲解如何用C语言实现二叉树的前序、中序和后序遍历。 **1. 二叉树节点定义** 首先,我们需要定义一个二叉树节点结构体,包含一个整型值(代表节点的数据)和两个指向子节点的指针: ```c typedef struct...
本文将详细讲解C语言中如何建立和遍历二叉树。 首先,我们需要理解二叉树的基本概念。二叉树是由n(n>=0)个有限节点组成的一个有穷集合,这些节点满足以下条件: 1. 有且仅有一个特定的称为根(root)的节点。 2....
本资源提供了详细的数据结构C语言版二叉树及其查找结构的知识点,包括树的定义、树的特点、二叉树的基本形态、 二叉树的性质、二叉树的存储结构和普通树转换成二叉树等方面的内容,对学习数据结构的新手有很大的帮助...
在计算机科学中,二叉树是一种特殊的图结构,每个节点最多有两个子节点,通常分为左子节点和右子节点。二叉树的概念是理解和解决许多数据结构问题的...通过阅读和理解这些代码,可以深入学习二叉树的理论和实践应用。
总的来说,理解和实现二叉树在C语言中的操作是数据结构学习的重要部分。通过实际编码练习,不仅可以巩固理论知识,还能提高解决实际问题的能力。在软件开发中,二叉树常用于搜索、排序和索引等任务,因此熟练掌握...
在深入探讨C语言实现二叉树的后序遍历(递归)之前,我们先来了解下二叉树以及后序遍历的基本概念。 **二叉树简介:** 二叉树是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。...
在IT领域,二叉树是一种基础且重要的数据结构,它由节点构成,每个节点最多有两个子节点,通常称为左子节点和右子节点。...通过学习和实践这个项目,你可以深入理解二叉树的操作,并提高自己的编程技能。
在IT领域,特别是数据结构与算法的学习中,平衡二叉树是一种重要的数据结构。本文将深入探讨C语言实现平衡二叉树的相关知识点。 首先,我们要理解什么是二叉树。二叉树是每个节点最多有两个子节点的树形数据结构,...
在C语言中实现二叉树,需要理解基本的指针操作和数据结构的概念。本文将详细讲解如何用C语言创建、遍历和删除二叉树。 首先,我们需要定义一个结构体来表示二叉树的节点。这个结构体通常包含一个数据域用于存储信息...
在计算机科学领域,二叉树是一种重要的数据结构,而遍历则是操作这种数据结构的基本方式之一。根据访问节点的顺序不同,二叉树的遍历可以分为前序遍历、中序遍历和后序遍历三种主要方式。本篇文章将重点介绍二叉树的...
本文档为数据结构C语言树二叉树的详细介绍,包括树的类型定义、二叉树的类型定义、二叉树的存储结构、二叉树的遍历、线索二叉树、树和森林的表示方法、树和森林的遍历、哈夫曼树与哈夫曼编码等内容。 树的类型定义...
在计算机科学领域,二叉树是一种重要的数据结构,而遍历则是操作与处理这种数据结构的基本方法之一。二叉树的遍历可以分为三种基本方式:前序遍历、中序遍历和后序遍历。本篇文章主要关注的是二叉树的中序遍历,尤其...
这个“数据结构(c语言版二叉树设计性实验)”显然是一个教学或实践项目,旨在通过C语言实现二叉树的各种操作,帮助学习者深入理解二叉树的概念和应用。 首先,我们需要了解二叉树的基本概念。二叉树可以是空树,或者...
在这个实例中,我们将学习如何用C语言创建一个二叉树,并进行前序遍历。 首先,我们定义了一个名为`node`的结构体,它包含三个成员:`data`存储节点的值,`lchild`指向左子节点的指针,以及`rchild`指向右子节点的...
在IT领域,二叉树是一种基础且重要的数据结构,它在...通过学习C语言版本的二叉树基本操作示例,不仅可以加深对二叉树概念的理解,还能提高实际编程能力。如果你正在探索这个主题,这份10页的资料将是一个宝贵的资源。
在IT领域,数据结构是计算机科学中的...通过学习和实践二叉树的数据结构,不仅可以提高算法设计能力,也有助于理解其他高级数据结构,如堆、图和Trie树。掌握二叉树在C语言中的实现,能为解决实际问题提供有力工具。
在计算机科学中,二叉树是一种特殊的图结构,它的每个节点最多只有两个子节点,通常分为左子节点和右子节点。C语言由于其简洁高效的特点...通过学习和实践这些代码,你可以增强对C语言和数据结构的理解,提高编程能力。