c语言先序建立一个二叉树,输出中序遍历结果的倒数第k个值
时间: 2023-06-09 18:07:46 浏览: 101
C语言实现二叉树的前序、中序、后续遍历(递归法)
好的,我来回答您的问题。首先,先序建立二叉树的过程如下:
```
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
char data;
struct node *left;
struct node *right;
} Node;
Node* create(char data) {
Node *p = (Node*)malloc(sizeof(Node));
p->data = data;
p->left = NULL;
p->right = NULL;
return p;
}
Node* preCreateTree() {
char data;
scanf("%c", &data);
if (data == '#') { // 数组中用 '#' 表示 NULL
return NULL;
}
Node *root = create(data);
root->left = preCreateTree();
root->right = preCreateTree();
return root;
}
```
这里假设用户输入的二叉树用先序遍历表示,且用 `#` 表示 NULL。例如,输入 `AB##C##` 就可以构造出一棵树:
```
A
/ \
B C
/ \
# #
```
接下来是输出中序遍历结果的倒数第 k 个值的方法。我们对中序遍历进行改进,通过一个计数器实现查找结果。
```
void find_kth_node(Node *pNode, int k, int *count) {
if (pNode == NULL) {
return;
}
find_kth_node(pNode->left, k, count);
(*count)++;
if (*count == k) {
printf("%c", pNode->data);
}
find_kth_node(pNode->right, k, count);
}
```
在主函数中使用:
```
int main() {
Node *root = preCreateTree();
int k;
printf("请输入 k 的值:");
scanf("%d", &k);
int count = 0;
printf("中序遍历的倒数第 %d 个节点的值为:", k);
find_kth_node(root, k, &count);
printf("\n");
return 0;
}
```
这样输出的就是中序遍历结果的倒数第 k 个值了。希望我的回答对您有帮助。
阅读全文