代码使用C语言编写,主要包括以下部分:
定义二叉树节点和队列节点的数据结构。
构建二叉树的函数 buildBinaryTree。
前序遍历函数 preOrder。
主函数 main,从标准输入读取数据并构建二叉树,然后打印树的前序遍历结果。
#include<stdio.h>
#include<stdlib.h>
typedef char ElemType; // 为了树中放任意类型元素方便
typedef struct node_t {
ElemType c;
struct node_t *pright;
struct node_t *pleft;
} Node_t, *pNode_t;
// queue[kju]
// 辅助队列数据结构,每个元素放的树中元素节点地址值,能快速定位树中节点
typedef struct queue_t {
pNode_t insertPos;
struct queue_t *pNext;
} Queue_t, *pQueue_t;
void preOrder(pNode_t);
void buildBinaryTree(pNode_t *treeRoot, pQueue_t *queHead, pQueue_t *queTail, ElemType val) {
pNode_t treeNew = (pNode_t)calloc(1, sizeof(Node_t));
pQueue_t queNew = (pQueue_t)calloc(1, sizeof(Queue_t));
if (treeNew == NULL || queNew == NULL) {
printf("内存分配失败\n");
exit(1);
}
pQueue_t queCur = *queHead;
treeNew->c = val;
queNew->insertPos = treeNew;
if (*treeRoot == NULL) {
*treeRoot = treeNew;
*queHead = queNew;
*queTail = queNew;
} else {
(*queTail)->pNext = queNew;
*queTail = queNew;
if (queCur->insertPos->pleft == NULL) {
queCur->insertPos->pleft = treeNew;
} else if (queCur->insertPos->pright == NULL) {
queCur->insertPos->pright = treeNew;
*queHead = queCur->pNext;
free(queCur);
queCur = NULL;
}
}
}
int main() {
ElemType val;
pNode_t treeRoot = NULL;
pQueue_t queHead = NULL, queTail = NULL;
printf("请输入构建二叉树的字符(以换行结束):\n");
while (scanf("%c", &val) != EOF) {
if (val == '\n') {
break;
}
buildBinaryTree(&treeRoot, &queHead, &queTail, val);
}
printf("前序打印:\n");
preOrder(treeRoot);
// 清理内存
while (queHead != NULL) {
pQueue_t temp = queHead;
queHead = queHead->pNext;
free(temp);
}
return 0;
}
void preOrder(pNode_t p) {
if (p != NULL) {
putchar(p->c);
preOrder(p->pleft);
preOrder(p->pright);
}
}
buildBinaryTree
函数用于根据输入值构建二叉树。- 使用
calloc
分配新的树节点和队列节点。 - 如果树是空的,初始化根节点和队列头尾。
- 否则,更新队列,插入新的节点到合适的位置(左子节点或右子节点)。
- 如果当前节点的左右子节点都被填充,队列头指针前移,释放当前队列节点。
时间复杂度分析:
-
构建二叉树的时间复杂度:
- 每插入一个节点需要在队列中查找合适的位置,并插入到树中。
- 队列的插入和删除操作都是O(1)的。
- 插入一个节点的时间复杂度是O(1),构建整个树的时间复杂度是O(n),其中n是节点的数量。
-
前序遍历的时间复杂度:
- 前序遍历每个节点都需要访问一次,所以时间复杂度是O(n),其中n是节点的数量。
空间复杂度分析:
-
构建二叉树的空间复杂度:
- 需要存储n个节点,每个节点需要固定的空间,所以空间复杂度是O(n)。
- 需要一个辅助队列,最坏情况下队列中会存储所有节点的指针,所以空间复杂度是O(n)。
-
前序遍历的空间复杂度:
- 递归调用的深度为树的高度,最坏情况下(完全不平衡的树)高度为n,所以空间复杂度是O(n)。
- 平均情况下(平衡树)高度为log(n),所以空间复杂度是O(log(n))。