以我给你的二叉树为结构,线索化,编写程序查找某结点的后继结点。C语言实现
时间: 2024-01-21 22:19:22 浏览: 77
C语言实现二叉树线索化
以下是基于中序线索化二叉树的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树结点
typedef struct TreeNode {
char data;
struct TreeNode *left;
struct TreeNode *right;
int ltag, rtag; // 线索化标志,0表示指向左右子树,1表示指向前驱后继结点
} TreeNode;
// 创建二叉树
TreeNode* createTree() {
char ch;
scanf("%c", &ch);
if (ch == '#') {
return NULL;
}
TreeNode *node = (TreeNode*)malloc(sizeof(TreeNode));
node->data = ch;
node->left = createTree();
node->right = createTree();
node->ltag = 0;
node->rtag = 0;
return node;
}
// 中序线索化
void inOrderThreading(TreeNode *root, TreeNode **pre) {
if (root) {
inOrderThreading(root->left, pre);
if (!root->left) {
root->ltag = 1;
root->left = *pre;
}
if (*pre && !(*pre)->right) {
(*pre)->rtag = 1;
(*pre)->right = root;
}
*pre = root;
inOrderThreading(root->right, pre);
}
}
// 查找某结点的后继结点
TreeNode* findNextNode(TreeNode *node) {
if (node->rtag == 1) {
return node->right;
} else {
TreeNode *p = node->right;
while (p && p->ltag == 0) {
p = p->left;
}
return p;
}
}
int main() {
TreeNode *root = createTree();
TreeNode *pre = NULL;
inOrderThreading(root, &pre);
printf("请输入要查找后继结点的结点值:");
char ch;
scanf("%c", &ch);
TreeNode *node = root;
while (node && node->data != ch) {
node = node->right;
}
if (!node) {
printf("未找到该结点!\n");
} else {
TreeNode *nextNode = findNextNode(node);
if (nextNode) {
printf("该结点的后继结点为:%c\n", nextNode->data);
} else {
printf("该结点没有后继结点!\n");
}
}
return 0;
}
```
该程序中,`createTree()`函数用于创建二叉树,`inOrderThreading()`函数用于中序线索化二叉树,`findNextNode()`函数用于查找某结点的后继结点。在 `main()` 函数中,先输入要查找后继结点的结点值,然后查找该结点并调用 `findNextNode()` 函数查找后继结点,最后输出结果。
阅读全文