二叉树是n( n ⩾ \geqslant ⩾ 0 )个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根节点和两个互不相交的、分别称为根节点的左子树和右子树的二叉树组成。
二叉链表
因为二叉数每个结点最多只有两个孩子,所以我们可以通过链表的方式表示,链表由一个数据域和两个指针域组成。
lchild | data | rchild |
---|---|---|
指向左孩子指针 | 数据域 | 指向右孩子指针 |
typedef struct BiTNode
{
char data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
二叉树创建
通常以前序的方式创建二叉树,即先写某一结点的数据,再写其左孩子数据,最后写其右孩子数据。
/********************************************************************************************\
*function: 通过键盘输入以前序的方式创建二叉树
*intput: BiTree *Tree -- BiTNode的二级指针(函数的指针只传递其内容,因此利用指针申请内存,应使用二级指针)
*output: none
*return: void
\********************************************************************************************/
void CreateBiTree(BiTree *Tree)
{
char str;
scanf("%c", &str); //从键盘读取字符
if (str == '#') //以#表示空结点
{
*Tree = NULL;
}
else
{
*Tree = (BiTree )malloc(sizeof(BiTNode)); //为新结点申请内存
if(*Tree == NULL)
{
exit(1); //申请内存失败,中断程序运行
}
(*Tree)->data = str; //写入此结点数据
CreateBiTree(&(*Tree)->lchild); //写左孩子数据
CreateBiTree(&(*Tree)->rchild); //写右孩子数据
}
}
二叉树遍历
通常有3种方式遍历二叉树,即前序、中序、后序的方法。
前序:先读结点数据,再读左孩子的数据,最后读右孩子的数据;
中序:先读左孩子的数据,再读结点的数据,最后读右孩子数据