二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分 [1] 。
二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个节点
以下为二叉树的代码实现:
#include <stdio.h>
#include <stdlib.h>
//定义二叉树的基本结构
typedef struct linkTree {
int data;
struct linkTree *lchild, *rchild;
} linkTree, *linkPoint;
//通过递归构造二叉树
void creatBody(linkPoint *p) {
int num;
scanf("%d", &num);
if (num == 0)
(*p) = NULL;
else {
(*p) = (linkPoint)malloc(sizeof(linkTree));
(*p)->data = num;
creatBody(&((*p)->lchild));
creatBody(&((*p)->rchild));
}
}
//先序遍历二叉树
void preOrder(linkPoint p) {
if (p != NULL) {
printf("%d ", p->data);
preOrder(p->lchild);
preOrder(p->rchild);
}
}
//中序遍历二叉树
void midOrder(linkPoint p) {
if (p != NULL) {
midOrder(p->lchild);
printf("%d ", p->data);
midOrder(p->rchild);
}
}
//后序遍历二叉树
void behOrder(linkPoint p) {
if (p != NULL) {
behOrder(p->lchild);
behOrder(p->rchild);
printf("%d ", p->data);
}
}
//主函数
int main() {
linkPoint p = (linkPoint)malloc(sizeof(linkTree));
creatBody(&p);
midOrder(p);
printf("\n");
preOrder(p);
printf("\n");
behOrder(p);
printf("\n");
return 0;
}
- 如果想将二叉树变为线索二叉树,可以添加以下代码
//通过遍历将二叉树变为线索二叉树
void addClue(linkPoint *p, linkPoint pre) {
if ((*p) != NULL) {
addClue(&((*p)->lchild), pre);
if ((*p)->lchild = NULL) {
(*p)->lchild = pre;
(*p)->ltag = 1;
}
if (pre != NULL && pre->rchild == NULL) {
pre->rchild = *p;
pre->rtag = 1;
}
pre = *p;
addClue(&((*p)->rchild), pre);
}
}