c语言,先按先序建立二叉树,然后输出先序遍历结果的第k个结点值
时间: 2023-06-09 10:07:59 浏览: 128
好的,让我来回答你的问题。
对于先按先序建立二叉树,我们可以使用递归的方式来实现,每次读入一个节点的值,如果该节点的值为#,则返回NULL,否则创建一个新节点,将该节点的值设置为当前值,然后递归创建该节点的左右子树。代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
// 二叉树节点定义
typedef struct TreeNode {
char val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 先序遍历建立二叉树
TreeNode* createTree() {
char ch;
scanf("%c", &ch);
if (ch == '#') {
return NULL;
}
TreeNode *root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = ch;
root->left = createTree();
root->right = createTree();
return root;
}
// 先序遍历二叉树
void preOrder(TreeNode *root) {
if (root == NULL) {
return;
}
printf("%c ", root->val);
preOrder(root->left);
preOrder(root->right);
}
// 获取先序遍历结果的第k个结点值
char kthNode(TreeNode *root, int *k) {
if (root == NULL) {
return '#';
}
char val = root->val;
if (*k == 1) {
return val;
}
(*k)--;
char left_val = kthNode(root->left, k);
if (left_val != '#') {
return left_val;
}
return kthNode(root->right, k);
}
int main() {
// 输入先序遍历结果
printf("请输入先序遍历结果(空节点用#表示):");
TreeNode *root = createTree();
// 输出先序遍历结果
printf("先序遍历结果为:");
preOrder(root);
printf("\n");
// 输入k
int k;
printf("请输入k:");
scanf("%d", &k);
// 输出先序遍历结果的第k个结点值
char kVal = kthNode(root, &k);
printf("先序遍历结果的第%d个结点值为:%c\n", k, kVal);
return 0;
}
```
希望我的回答能够帮到你!
阅读全文