二叉树(Binary Tree):是n(n>=0)个结点的有限集合,该集合或者为空集,或者是由一个根节点和两颗互不相交的、分别为根节点的子二叉树组成。
二叉树的特点:每个结点最多有两个子树,且左右有序,不可颠倒。
斜树:所有节点都只有左子树,或只有右子树的二叉树,分别称为左斜树和右斜树,统称为斜树。
满二叉树:在一棵二叉树中,所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上。
完全二叉树:对于一颗具有n个结点的二叉树按层序编号,编号为i(1<=i且i<=n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中的位置完全相同。
#include<stdio.h>
#include<math.h>
#include "string.h"
#include<malloc.h>
#define MAXSIZE 128 /* 存储空间初始分配量 */
typedef char TElemType;
typedef enum{ False = 0, True = 1 }Bool;//用枚举写的一个简单的bool
typedef TElemType SqBiTree[MAXSIZE];
TElemType Nil = ' '; /* 字符型以空格符为空 */
typedef struct BiTNode /* 结点结构 */
{
TElemType data; /* 结点数据 */
struct BiTNode *lchild, *rchild; /* 左右孩子指针 */
}BiTNode, *BiTree;
int index = 1; //索引,因为0存放元素个数,所以从1开始
typedef char String[24]; /* 0号单元存放串的长度 */
String str;
Bool StrAssign(String T, char *chars)
{
int i;
if (strlen(chars)>MAXSIZE)
return False;
else
{
T[0] = strlen(chars); //存放长度
for (i = 1; i <= T[0]; i++)
T[i] = *(chars + i - 1); //从字符串依次赋值给数组
return True;
}
}
Bool InitBiTree(BiTree *T)
{
*T = NULL;
return True;
}
void CreateBiTree(BiTree *T)
{
TElemType ch;
/* scanf("%c",&ch); */
ch = str[index++];
if (ch == '#') //#表示空树
*T = NULL;
else
{
*T = (BiTree)malloc(sizeof(BiTNode));
if (!*T)
exit(OVERFLOW);
(*T)->data = ch; /* 生成根结点 */
CreateBiTree(&(*T)->lchild); /* 构造左子树 */
CreateBiTree(&(*T)->rchild); /* 构造右子树 */
}
}
Bool visit(TElemType e)
{
printf("%c ", e);
return True;
}
void DestroyBiTree(BiTree *T)
{
if (*T)
{
if ((*T)->lchild) /* 若有左孩子 */
DestroyBiTree(&(*T)->lchild); /* 销毁左孩子子树 */
if ((*T)->rchild) /* 若有右孩子 */
DestroyBiTree(&(*T)->rchild); /* 销毁右孩子子树 */
free(*T); /* 释放根结点 */
*T = NULL; /* 空指针赋0 */
}
}
#define ClearBiTree DestroyBiTree
Bool BiTreeEmpty(BiTree T)
{
if (T)
return False;
else
return True;
}
int BiTreeDepth(BiTree T)
{
int i, j;
if (!T)
return 0;
if (T->lchild)
i = BiTreeDepth(T->lchild);
else
i = 0;
if (T->rchild)
j = BiTreeDepth(T->rchild);
else
j = 0;
return i>j ? i + 1 : j + 1;
}
TElemType Root(BiTree T)
{
if (BiTreeEmpty(T))
return Nil; //见初始设定
else
return T->data;
}
TElemType Value(BiTree p)
{
return p->data;
}
void Assign(BiTree p, TElemType value)
{
p->data = value;
}
void PreOrderTraverse(BiTree T)
{
if (T == NULL)
return;
printf("%c", T->data);//显示结点数据,可以更改为其它对结点操作
PreOrderTraverse(T->lchild); //再先序遍历左子树
PreOrderTraverse(T->rchild); //最后先序遍历右子树
}
void InOrderTraverse(BiTree T)
{
if (T == NULL)
return;
InOrderTraverse(T->lchild); //中序遍历左子树
printf("%c", T->data);//显示结点数据,可以更改为其它对结点操作
InOrderTraverse(T->rchild); //最后中序遍历右子树
}
void PostOrderTraverse(BiTree T)
{
if (T == NULL)
return;
PostOrderTraverse(T->lchild); //先后序遍历左子树
PostOrderTraverse(T->rchild); //再后序遍历右子树
printf("%c", T->data);//显示结点数据,可以更改为其它对结点操作
}