一、引言
二叉树作为一种重要的数据结构,在计算机科学的众多领域都有着广泛的应用。对二叉树的遍历和创建操作是处理二叉树的基础。本文将通过一段 C++ 代码,详细解析二叉树的先序、中序、后序遍历以及创建的实现过程。
二、代码整体结构
- 数据结构定义:定义了二叉树节点结构
binode
和两个辅助队列结构lstqu
与qq
。 - 队列操作函数:包括初始化队列
initq
、判断队列是否为空empty
、入队push
和出队front
。 - 二叉树遍历函数:先序遍历(借助队列实现)
cxbl
,以及递归实现的先序prbl
、中序inbl
、后序postbl
遍历。 - 二叉树创建函数:
creatree
用于递归创建二叉树。
三、数据结构定义
- 二叉树节点结构
binode
typedef struct node {
int date;
struct node* lc, * rc;
}binode, * bitree;
这里定义了二叉树的节点,每个节点包含一个整数值 date
用于存储数据,以及两个指针 lc
和 rc
分别指向左孩子和右孩子节点。
- 队列节点结构
lstqu
和队列结构qq
typedef struct node1 {
bitree date;
struct node1* next;
}lstqu;
typedef struct node2 {
lstqu *front, *rear;
}qq;
lstqu
是队列的节点结构,其中 date
存放二叉树节点指针,next
指向下一个队列节点。qq
定义了队列,包含队头指针 front
和队尾指针 rear
。
四、队列操作函数
- 初始化队列
initq
void initq(qq* Q) {
Q->front = Q->rear = (lstqu*)malloc(sizeof(lstqu));
Q->front->next = NULL;
}
此函数为队列分配内存并初始化队头和队尾指针,使其指向同一个空节点,并将该节点的 next
设为 NULL
。
- 判断队列是否为空
empty
int empty(qq* Q) {
if (Q->rear == Q->front)
return 1;
else
return 0;
}
通过比较队头和队尾指针是否相等来判断队列是否为空。
- 入队操作
push
void push(qq* Q, bitree root) {
lstqu* q = (lstqu*)malloc(sizeof(lstqu));
q->date = root;
q->next = NULL;
Q->rear->next = q;
Q->rear = q;
}
为新节点分配内存,将传入的二叉树节点指针存入新节点,然后将新节点加入队尾。
- 出队操作
front
void front(qq* Q, bitree *root) {
lstqu* q = Q->front->next;
*root = q->date;
Q->front->next = q->next;
if (q->next == NULL) Q->rear = Q->front;
free(q);
}
取出队头节点的数据(即二叉树节点指针),调整队头指针,若此时队列为空则更新队尾指针,最后释放队头节点的内存。
五、二叉树遍历函数
- 先序遍历(借助队列实现)
cxbl
void cxbl(bitree boot) {
qq* Q;
initq(Q);
bitree p;
push(Q, boot);
while (!empty(Q)) {
front(Q, &p);
cout << p->date << " ";
if (p->lc!= NULL) push(Q, p->lc);
if (p->rc!= NULL) push(Q, p->rc);
}
}
先初始化队列并将根节点入队,然后不断从队列中取出节点,输出其数据,再将其左右孩子节点(若存在)入队,以此实现先序遍历。
- 递归先序遍历
prbl
void prbl(bitree root) {
if (root == NULL) return;
cout << root->date << endl;
prbl(root->lc);
prbl(root->rc);
}
若节点不为空,先输出节点数据,然后递归遍历左子树和右子树,实现先序遍历。
- 中序遍历
inbl
void inbl(bitree root) {
if (root == NULL) return;
prbl(root->lc);
cout << root->date << endl;
prbl(root->rc);
}
先递归遍历左子树,然后输出节点数据,最后递归遍历右子树,实现中序遍历。
- 后序遍历
postbl
void postbl(bitree root) {
if (root == NULL) return;
prbl(root->lc);
prbl(root->rc);
cout << root->date << endl;
}
先递归遍历左子树和右子树,最后输出节点数据,实现后序遍历。
六、二叉树创建函数 creatree
bitree creatree() {
bitree t;
int x;
cin >> x;
if (x == 0) t = NULL;
else {
t = (bitree)malloc(sizeof(bitree));
t->date = x;
t->lc = creatree();
t->rc = creatree();
}
return t;
}
八、总结
通过对这段代码的详细解析,我们深入了解了二叉树的遍历和创建在 C++ 中的实现方法。递归遍历方式简洁明了,而借助队列实现的先序遍历则展示了不同的数据处理思路。这些操作是进一步学习二叉树相关算法和应用的重要基础。