用C语言写出先序线索二叉树的完整代码
时间: 2024-05-14 18:15:37 浏览: 103
以下是先序线索二叉树的完整代码,包括了创建二叉树、先序遍历、以及先序线索化的实现。
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct ThreadNode {
char data;
struct ThreadNode *leftChild, *rightChild;
int lTag, rTag; // 左右线索标记
} ThreadNode, *ThreadTree;
ThreadTree createThreadTree() {
char data;
scanf("%c", &data);
if (data == '#') {
return NULL;
}
ThreadNode *node = (ThreadNode *)malloc(sizeof(ThreadNode));
node->data = data;
node->leftChild = createThreadTree();
node->rightChild = createThreadTree();
return node;
}
ThreadNode *preNode = NULL; // 全局变量,记录前驱节点
void preThread(ThreadNode *p) {
if (p) {
if (!p->leftChild) { // 左子树为空,建立前驱线索
p->lTag = 1;
p->leftChild = preNode;
}
if (preNode && !preNode->rightChild) { // 前驱节点的右子树为空,建立后继线索
preNode->rTag = 1;
preNode->rightChild = p;
}
preNode = p;
if (p->lTag == 0) {
preThread(p->leftChild);
}
if (p->rTag == 0) {
preThread(p->rightChild);
}
}
}
void preOrder(ThreadNode *p) {
if (p) {
printf("%c ", p->data);
if (p->lTag == 0) {
preOrder(p->leftChild);
}
if (p->rTag == 0) {
preOrder(p->rightChild);
}
}
}
int main() {
printf("请输入先序遍历序列(#表示空节点):\n");
ThreadTree tree = createThreadTree();
preThread(tree);
printf("先序遍历结果为:\n");
preOrder(tree);
printf("\n");
return 0;
}
```
阅读全文