`
hufeng
  • 浏览: 103296 次
  • 性别: Icon_minigender_1
  • 来自: 江西
社区版块
存档分类
最新评论
阅读更多
#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);
*/
}
分享到:
评论

相关推荐

    C语言实现二叉树的重建源码

    本代码示例不仅展示了如何在VC环境下调试和运行C语言程序,更重要的是,它提供了一个实用的框架,帮助学习者理解和实践二叉树的重建算法。对于希望深入了解数据结构和算法的开发者来说,这是一个宝贵的资源。

    C语言实现二叉树操作

    在IT领域,C语言是一种基础且强大的编程语言,尤其适合实现数据结构和算法。本主题聚焦于使用C语言实现二叉树...在"压缩包子文件的文件名称列表"中的"C_二叉树"可能包含了具体的代码实现,可以作为学习和参考的实例。

    c语言实现二叉树的遍历

    本篇将详细讲解如何用C语言实现二叉树的前序、中序和后序遍历。 **1. 二叉树节点定义** 首先,我们需要定义一个二叉树节点结构体,包含一个整型值(代表节点的数据)和两个指向子节点的指针: ```c typedef struct...

    C语言二叉树的建立和遍历

    本文将详细讲解C语言中如何建立和遍历二叉树。 首先,我们需要理解二叉树的基本概念。二叉树是由n(n&gt;=0)个有限节点组成的一个有穷集合,这些节点满足以下条件: 1. 有且仅有一个特定的称为根(root)的节点。 2....

    数据结构C语言版二叉树及其查找结构

    本资源提供了详细的数据结构C语言版二叉树及其查找结构的知识点,包括树的定义、树的特点、二叉树的基本形态、 二叉树的性质、二叉树的存储结构和普通树转换成二叉树等方面的内容,对学习数据结构的新手有很大的帮助...

    C语言实现二叉树的创建、插入、删除、遍历等操作

    在计算机科学中,二叉树是一种特殊的图结构,每个节点最多有两个子节点,通常分为左子节点和右子节点。二叉树的概念是理解和解决许多数据结构问题的...通过阅读和理解这些代码,可以深入学习二叉树的理论和实践应用。

    数据结构 C语言建立二叉树

    总的来说,理解和实现二叉树在C语言中的操作是数据结构学习的重要部分。通过实际编码练习,不仅可以巩固理论知识,还能提高解决实际问题的能力。在软件开发中,二叉树常用于搜索、排序和索引等任务,因此熟练掌握...

    C语言实现二叉树的后序遍历(递归)

    在深入探讨C语言实现二叉树的后序遍历(递归)之前,我们先来了解下二叉树以及后序遍历的基本概念。 **二叉树简介:** 二叉树是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。...

    C语言翻转二叉树.zip

    在IT领域,二叉树是一种基础且重要的数据结构,它由节点构成,每个节点最多有两个子节点,通常称为左子节点和右子节点。...通过学习和实践这个项目,你可以深入理解二叉树的操作,并提高自己的编程技能。

    C语言平衡二叉树.zip

    在IT领域,特别是数据结构与算法的学习中,平衡二叉树是一种重要的数据结构。本文将深入探讨C语言实现平衡二叉树的相关知识点。 首先,我们要理解什么是二叉树。二叉树是每个节点最多有两个子节点的树形数据结构,...

    C语言实现二叉树的建立

    在C语言中实现二叉树,需要理解基本的指针操作和数据结构的概念。本文将详细讲解如何用C语言创建、遍历和删除二叉树。 首先,我们需要定义一个结构体来表示二叉树的节点。这个结构体通常包含一个数据域用于存储信息...

    C语言实现二叉树的后续遍历(非递归)

    在计算机科学领域,二叉树是一种重要的数据结构,而遍历则是操作这种数据结构的基本方式之一。根据访问节点的顺序不同,二叉树的遍历可以分为前序遍历、中序遍历和后序遍历三种主要方式。本篇文章将重点介绍二叉树的...

    数据结构C语言树二叉树详细举例介绍PPT学习教案.pptx

    本文档为数据结构C语言树二叉树的详细介绍,包括树的类型定义、二叉树的类型定义、二叉树的存储结构、二叉树的遍历、线索二叉树、树和森林的表示方法、树和森林的遍历、哈夫曼树与哈夫曼编码等内容。 树的类型定义...

    C语言实现二叉树的中序遍历(递归)

    在计算机科学领域,二叉树是一种重要的数据结构,而遍历则是操作与处理这种数据结构的基本方法之一。二叉树的遍历可以分为三种基本方式:前序遍历、中序遍历和后序遍历。本篇文章主要关注的是二叉树的中序遍历,尤其...

    数据结构(c语言版二叉树设计性实验)

    这个“数据结构(c语言版二叉树设计性实验)”显然是一个教学或实践项目,旨在通过C语言实现二叉树的各种操作,帮助学习者深入理解二叉树的概念和应用。 首先,我们需要了解二叉树的基本概念。二叉树可以是空树,或者...

    c语言构建二叉树

    在这个实例中,我们将学习如何用C语言创建一个二叉树,并进行前序遍历。 首先,我们定义了一个名为`node`的结构体,它包含三个成员:`data`存储节点的值,`lchild`指向左子节点的指针,以及`rchild`指向右子节点的...

    c语言版本二叉树基本操作示例(先序递归非递归)共10页.p

    在IT领域,二叉树是一种基础且重要的数据结构,它在...通过学习C语言版本的二叉树基本操作示例,不仅可以加深对二叉树概念的理解,还能提高实际编程能力。如果你正在探索这个主题,这份10页的资料将是一个宝贵的资源。

    数据结构c语言版本 二叉树

    在IT领域,数据结构是计算机科学中的...通过学习和实践二叉树的数据结构,不仅可以提高算法设计能力,也有助于理解其他高级数据结构,如堆、图和Trie树。掌握二叉树在C语言中的实现,能为解决实际问题提供有力工具。

    C语言实现二叉树的基本操作.zip

    在计算机科学中,二叉树是一种特殊的图结构,它的每个节点最多只有两个子节点,通常分为左子节点和右子节点。C语言由于其简洁高效的特点...通过学习和实践这些代码,你可以增强对C语言和数据结构的理解,提高编程能力。

Global site tag (gtag.js) - Google Analytics