数据结构之二叉树的代码实现 C语言版

前言

树是一种结合了另外两种数据结构的优点的结构
一种是顺序表,树结构的查询速度和有序数组一样快
一种是链表,树结构的插入数据和删除数据速度和链表一样快
在树的操作中,大量运用了递归的原理

1.二叉树的结构体表示

这个表示和前面链表的结构体表示有点类似,不过他内部包含了两个指针域。
大概可以这么理解,链表是一维的,你可以认为他只有宽度,而二叉树是二维的,既有深度也有“宽度”,有明显的层次关系,比链表要复杂一些

typedef struct BTNode
{
	TElemType data;
	struct BTNode *lchild,*rchild;
}BTNode,*BTree;

2.一些操作

二叉树的一些基本操作包括了创建,三种遍历,求结构个数,深度,叶子结点数
而这些操作中,都用到了递归的方法
以一颗二叉树作为典型:

二叉树

3.前序创建

二叉树用前序创建,空用‘#’来表示
如图:
前序遍历
遍历结果为:
ABDH#K###E##CFI###G#J##

代码

#include<stdio.h>
#include<stdlib.h>

#define OK 1
#define ERROR 0
typedef char TElemType;

//二叉树的二叉链表的结点结构定义代码
typedef struct BTNode
{
	TElemType data;
	struct BTNode *lchild,*rchild;
}BTNode,*BTree;

void CreatBTree(BTree *T);//前序遍历生成二叉树
void PrtOrderTraverse(BTree T);//前序遍历二叉树
void InOrderTraverse(BTree T);//中序遍历二叉树
void PostOrderTraverse(BTree T);//后序遍历二叉树
int Deep(BTree T);//求树的深度
int NodeCount(BTree T);//求树的结点数
int LeafCount(BTree T);//统计二叉树中叶子结点的个数

int main()
{
	BTree T = NULL;
	printf("先序遍历生成二叉树\n");
	CreatBTree(&T);
	printf("前序遍历\n");
	PrtOrderTraverse(T);
	printf("\n");
	printf("中序遍历\n");
	InOrderTraverse(T);
	printf("\n");
	printf("后序遍历\n");
	PostOrderTraverse(T);
	printf("\n");
	int m = Deep(T);
	printf("树的深度:%d\n",m);
	int n = NodeCount(T);
	printf("树的结点数:%d\n",n);
	int y = LeafCount(T);
	printf("叶子结点数:%d\n",y);
}

//前序遍历生成二叉树
void CreatBTree(BTree *T)
{
	TElemType ch;
	scanf("%c",&ch);
	if(ch == '#')
		*T = NULL;
	else
	{
		*T = (BTree)malloc(sizeof(BTNode));
		if(!*T)
			printf("失败\n");
		(*T)->data = ch;
		CreatBTree(&(*T)->lchild);//左子树
		CreatBTree(&(*T)->rchild);//右子树
	}
}

//前序遍历二叉树
void PrtOrderTraverse(BTree T)
{
	if(T == NULL)
		return;
	printf("%c ",T->data);
	PrtOrderTraverse(T->lchild);
	PrtOrderTraverse(T->rchild);
}

//中序遍历二叉树
void InOrderTraverse(BTree T)
{
	if(T == NULL)
		return;
	InOrderTraverse(T->lchild);
	printf("%c ",T->data);
	InOrderTraverse(T->rchild);
}

//后序遍历二叉树
void PostOrderTraverse(BTree T)
{
	if(T == NULL)
		return;
	PostOrderTraverse(T->lchild);
	PostOrderTraverse(T->rchild);
	printf("%c ",T->data);
}

int Deep(BTree T)
{
	if(T == NULL)
		return 0;
	else
	{
		int m = Deep(T->lchild);
		int n = Deep(T->rchild);
		if(m>n)
			return (m+1);
		else
			return (n+1);
	}
}

int NodeCount(BTree T)
{
	if(T == NULL)
		return 0;
	else
		return NodeCount(T->lchild) + NodeCount(T->rchild) +1;
}

int LeafCount(BTree T)//统计二叉树中叶子结点的个数
{
    if(!T)
		return 0;
    if(!T->lchild &&!T->rchild)//如果二叉树左子树和右子树皆为空,说明该二叉树根节点为叶子节点,加1.
	{
        return 1;
    }
	else
	{
        return LeafCount(T->lchild)+LeafCount(T->rchild);
    }
}

运行结果

运行结果

后记

当然,树是一种很复杂的数据结构,还有比如二叉排序树(二叉查找树),平衡二叉树,红黑树等。我们会在查找那一章中进行解答。

今天的内容就是二叉树的基本操作及其内容,喜欢我的多多支持哦~

发布了12 篇原创文章 · 获赞 10 · 访问量 1138

猜你喜欢

转载自blog.csdn.net/bsqetuo/article/details/99824036