由于顺序存储结构会造成存储空间的浪费,顺序存储结构一般只用于完全二叉树。
1.二叉树的存储结构——二叉链表
二叉树每个节点最多有两个孩子,所以为它设计一个数据域和两个指针域,我们称这样的链表为二叉链表。
data是数据域,lchild和rchild都是指针域,分别指向左孩子和右孩子的指针。
结构定义代码。
/*二叉树的二叉链表节点结构定义*/
typedef struct BiTree{
TElemType data; /*节点数据*/
struct BiTree *lchild, *rchild; /*左右孩子指针*/
}BiTree, *BiTree;
2.遍历二叉树
1)前序遍历
若二叉树为空,则空操作返回。否则,先访问根节点,然后前序遍历左子树,再前序遍历右子树。 前--左---右
/*二叉树的前序遍历算法*/
void PreOrderTraverse(BiTree T)
{
if(T==NULL )
return;
printf("%c",T-data);/*显示节点数据,可以更改为其他对节点操作*/
PreOrderTraverse(T-<lchild);
PreOrderTRaverse(T->rchild);
}
2)中序遍历
左---根---右
/*二叉树的中序遍历算法*/
void InOrderTraverse(BiTree T)
{
if(T==NULL )
return;
InOrderTraverse(T-<lchild);
printf("%c",T-data);/*显示节点数据,可以更改为其他对节点操作*/
InOrderTRaverse(T->rchild);
}
3)后序遍历
左---右---根
/*二叉树的后序遍历算法*/
void PostOrderTraverse(BiTree T)
{
if(T==NULL )
return;
PostOrderTraverse(T-<lchild);
PostOrderTRaverse(T->rchild);
printf("%c",T-data);/*显示节点数据,可以更改为其他对节点操作*/
}
4)层序遍历
从上到下,从左到右。
3.二叉树的建立
/*按前序输入二叉树中节点的值(一个字符)*/
/*#表示空树,构造二叉链表表示二叉树T*/
void CreateBiTree(BiTree *T)
{
TElemType ch;
scanf("%c", &ch);
if(ch=='#')
*T =NULL ;
else
{
*T=(BiTree)malloc(sizeof(BiTNode));
if(!*T)
exit(OVERFLOW);
(*T)->data=ch;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
}