C语言以扩展先序遍历序列建立一个二叉树,并将该二叉树中序线索化,输入一个节点,输出在该中序线索二叉树中,该节点的直接前驱及直接后继节点,第一行为扩展先序遍历序列,第二行为待查找的节点,如果该节点有直接前驱,则输出该节点的直接前驱的数据域;若无,则输出NULL,如果该节点有直接后继,则输出该节点的直接后继的数据域;若无,则输出NULL
时间: 2023-07-14 08:13:32 浏览: 78
举例讲解C语言程序中对二叉树数据结构的各种遍历方式
以下是C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct ThreadNode {
int data;
struct ThreadNode *left, *right;
int ltag, rtag; // 线索标志
} ThreadNode, *ThreadTree;
// 创建二叉树
void createTree(ThreadTree *T) {
int data;
scanf("%d", &data);
if (data == -1) {
*T = NULL;
} else {
*T = (ThreadNode*)malloc(sizeof(ThreadNode));
(*T)->data = data;
(*T)->ltag = (*T)->rtag = 0;
createTree(&(*T)->left);
createTree(&(*T)->right);
}
}
// 中序线索化
void inThread(ThreadTree p, ThreadTree *pre) {
if (p != NULL) {
inThread(p->left, pre);
if (p->left == NULL) { // 左子树为空,建立前驱线索
p->left = *pre;
p->ltag = 1;
}
if (*pre != NULL && (*pre)->right == NULL) { // 前驱节点的右子树为空,建立后继线索
(*pre)->right = p;
(*pre)->rtag = 1;
}
*pre = p;
inThread(p->right, pre);
}
}
// 获取中序线索二叉树中节点的直接前驱
ThreadTree getPreNode(ThreadTree p) {
if (p->ltag == 1) { // 左子树为线索
return p->left;
} else { // 左子树为指针,找到左子树中的最右节点
ThreadTree tmp = p->left;
while (tmp->right != NULL && tmp->rtag == 0) {
tmp = tmp->right;
}
return tmp;
}
}
// 获取中序线索二叉树中节点的直接后继
ThreadTree getNextNode(ThreadTree p) {
if (p->rtag == 1) { // 右子树为线索
return p->right;
} else { // 右子树为指针,找到右子树中的最左节点
ThreadTree tmp = p->right;
while (tmp->left != NULL && tmp->ltag == 0) {
tmp = tmp->left;
}
return tmp;
}
}
int main() {
ThreadTree root, pre = NULL;
createTree(&root);
inThread(root, &pre);
int target;
scanf("%d", &target);
ThreadTree p = root;
while (p != NULL && p->data != target) {
if (target < p->data) {
p = p->left;
} else {
p = p->right;
}
}
if (p == NULL) {
printf("NULL\n");
} else {
ThreadTree preNode = getPreNode(p);
ThreadTree nextNode = getNextNode(p);
if (preNode != NULL) {
printf("%d ", preNode->data);
} else {
printf("NULL ");
}
if (nextNode != NULL) {
printf("%d", nextNode->data);
} else {
printf("NULL");
}
}
return 0;
}
```
输入示例:
```
6 2 1 -1 -1 4 3 -1 -1 5 -1 -1 8 7 -1 -1 9 -1 -1
4
```
输出示例:
```
2 5
```
阅读全文