定义
树的结点
如上图A的结点为2,B的结点为1,树的结点就是最多的那个,这棵树的结点就是3.
树的存储结构
树的存储结构可以是多样的
typedef struct BiTNode /* 结点结构 */
{
DATATYPE data; /* 结点数据 */
struct BiTNode *lchild,*rchild; /* 左右孩子指针 */
}BiTNode;
我们这里只用孩子域,也可以加上双亲或者兄弟域。
二叉树
满二叉树与万全二叉树
如图,这样一个二叉树就是满二叉树,完全二叉树就是满二叉树少了几个结点
但只能少右边的,不能少。
二叉树的编码
如图。
示例代码
这里只展示树的创建销毁与遍历
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char DATATYPE;
typedef struct BiTNode /* 结点结构 */
{
DATATYPE data; /* 结点数据 */
struct BiTNode *lchild,*rchild; /* 左右孩子指针 */
}BiTNode;
char dat[]="abd#g##eh###c#fi##j##";
int ind = 0 ;
void CreateTree(BiTNode** root)
{
char c = dat[ind++];
if('#'==c)
{
*root = NULL;
}
else
{
*root = (BiTNode*)malloc(sizeof(BiTNode));
(*root)->data = c;
CreateTree(&((*root)->lchild));
CreateTree(&((*root)->rchild));
}
return ;
}
void DestroyBiTree(BiTNode* root)
{
if(NULL == root)
{
return ;
}
DestroyBiTree(root->lchild);
DestroyBiTree(root->rchild);
free(root);
}
void PreOrderTraverse(BiTNode* root)
{
if(NULL == root)
{
return ;
}
else
{
printf("%c",root->data);
PreOrderTraverse(root->lchild);
PreOrderTraverse(root->rchild);
}
}
void InOrderTraverse(BiTNode* root)
{
if(NULL == root)
{
return ;
}
else
{
InOrderTraverse(root->lchild);
printf("%c",root->data);
InOrderTraverse(root->rchild);
}
}
void PostOrderTraverse(BiTNode* root)
{
if(NULL == root)
{
return ;
}
else
{
PostOrderTraverse(root->lchild);
PostOrderTraverse(root->rchild);
printf("%c",root->data);
}
}
int main(int argc, char *argv[])
{
BiTNode* root=NULL;
CreateTree(&root);
PreOrderTraverse(root);
printf("\n");
InOrderTraverse(root);
printf("\n");
PostOrderTraverse(root);
printf("\n");
DestroyBiTree(root);
return 0;
}
对于树的遍历,有前、中、后序遍历