一.树
树是一种递归定义的数据结构,是一种重要非线性的数据结构。它是由n(n>=1)个有限节点组成一个具有层次结构的集合。
二.树的相关术语
节点的度:一个节点含有的子树的个数称为该节点的度。
叶节点或终端节点:度为0的节点称为叶节点。
非终端节点或分支节点:度不为0的节点
兄弟节点:具有相同父节点的节点。
树的度:一棵树中,最大的节点的度称树的度。
节点的 层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推
树的高度或深度:树种节点的最大层次。
子孙:以某节点为根的子树种任一节点都称为该节点的子孙
三。种类
无序树:树中任意节点的子节点之间没有顺序关系,称为无序树,也成为自由树
有序树:树种任意节点的子节点时间有顺序关系,这种树称为有序树
二叉树:每个节点最多含有两个子树的树称为二叉树
完全二叉树:除了叶子节点,每个节点可以有左右子树或者左子树。
满二叉树:除了叶子节点外,每个节点都有两个结点
四。二叉树的存储结构
1.顺序
2.链式
这两种结构相比较而言。顺序结构数据的地址是连续的,便于查找数据。而链式结构数据不一定是连续的,便于数据的插入、删除操作。
五。二叉树数据结构的创建
typedef char datatype;
typedef struct _BiTNode
{
datatype data;
struct _BiTNode*leftChild;
struct _BiTNode *rightChild;
}BiTNode,*pBiTree;
//创建一颗二叉树
void Create(BiTNode &T)
{
char ch;
scanf("%c",&ch);
if(ch=='#')
T==NULL;
else
{
T=(BiTNode *)malloc(sizeof(BiTNode));
T->data=ch;
Create(T->leftChild);
Create(T->rightChild);
}
}
//先序遍历打印二叉树
void PreOrder(BiTNode &root)
{
if(root!=NULL)
{
printf("%c ",root->data);
PreOrder(root->leftChild);
PreOrder(root->rightChild);
}
}
//中序遍历打印二叉树
void InOrder(BiTNode &root)
{
if(root!=NULL)
{
InOrder(root->leftChild);
printf("%c ",root->data);
InOrder(root->rightChild);
}
}
//后序遍历打印二叉树
void PostOrder(BiTNode &root)
{
if(root!=NULL)
{
PostOrder(root->rightChild);
PostOrder(root->leftChild);
printf("%c ",root->data);
}
}
//先序遍历输出叶子节点
void PreOrderLeaf(BiTNode &root)
{
if(root!=NULL)
{
if(root->leftChild==NULL && root->rightChild==NULL)
{
printf("%c ",root->data);
PreOrderLeaf(root->leftChild);
PreOrderLeaf(root->rightChild);
}
}
}
//中序遍历输出叶子节点
void InOrderLeaf(BiTNode &root)
{
if(root!=NULL)
{
if(root->leftChild==NULL && root->rightChild)
{
InOrderLeaf(root->leftChild);
printf("%c ",root->data);
InOrderLeaf(root->rightChild);
}
}
}
//后序遍历输出叶子节点
void PostOrderLeaf(BiTNode &root)
{
if(root!=NULL)
{
if(root->leftChild && root->rightChild)
{
PostOrderLeaf(root->leftChild);
PostOrderLeaf(root->rightChild)
printf("%c ",root->data);
}
}
}
//统计叶子节点个数
int LeafCount(BiTNode &root)
{
int leaf;
if(root==NULL)
leaf=0;
else if(root->leftChild==NULL && root->rightChild==NULL)
{
leaf=1;
}
else
{
leaf=LeafCount(root->leftChild)+LeafCount(root->rightChild);
}
return leaf;
}
//统计树的高度
int PostTreeDepth(BiTNode &root)
{
int hl,hr,max;
if(root!=NULL)
{
hl=PostTreeDepth(root->leftChild);
hr=PostTreeDepth(root->rightChild);
max=((hl>hr)?hl:hr);
return max+1;
}
}