前言
树是一种结合了另外两种数据结构的优点的结构
一种是顺序表,树结构的查询速度和有序数组一样快
一种是链表,树结构的插入数据和删除数据速度和链表一样快
在树的操作中,大量运用了递归的原理
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);
}
}
运行结果
后记
当然,树是一种很复杂的数据结构,还有比如二叉排序树(二叉查找树),平衡二叉树,红黑树等。我们会在查找那一章中进行解答。
今天的内容就是二叉树的基本操作及其内容,喜欢我的多多支持哦~