用c语言实现求根结点到x结点的路径(假定结点不重复)。 输入样例: 输入一行字符序列先序递归构建二叉树。每个字符对应一个结点,#表示空结点。第二行输入一个结点值x。
时间: 2023-09-13 07:10:18 浏览: 347
好的,这里给出一种基于递归的实现方式。我们可以先构建二叉树,然后从根节点开始递归查找目标结点,如果找到目标结点,则将当前结点加入路径中,最终返回路径。
代码如下(使用C语言):
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 50
typedef struct _Node {
char data;
struct _Node *left;
struct _Node *right;
} Node;
// 根据先序遍历和中序遍历构建二叉树
Node* build_tree(char *preorder, char *inorder, int len) {
if (len == 0) {
return NULL;
}
Node *root = (Node*)malloc(sizeof(Node));
root->data = preorder[0];
root->left = NULL;
root->right = NULL;
int i;
for (i = 0; i < len; i++) {
if (inorder[i] == preorder[0]) {
break;
}
}
root->left = build_tree(preorder+1, inorder, i);
root->right = build_tree(preorder+i+1, inorder+i+1, len-i-1);
return root;
}
// 查找结点x,并返回从根节点到x的路径
int find_node(Node *root, char x, Node **path, int *path_len) {
if (root == NULL) {
return 0;
}
// 将当前结点加入路径中
path[(*path_len)++] = root;
if (root->data == x) {
return 1;
}
// 在左子树中查找
if (find_node(root->left, x, path, path_len)) {
return 1;
}
// 在右子树中查找
if (find_node(root->right, x, path, path_len)) {
return 1;
}
// 未找到目标结点,将当前结点从路径中删除
(*path_len)--;
return 0;
}
int main() {
char preorder[MAXN+1], inorder[MAXN+1];
char x;
scanf("%s", preorder);
scanf("%*c"); // 读入空格
scanf("%s", inorder);
scanf("%*c"); // 读入空格
scanf("%c", &x);
int n = strlen(preorder);
Node *root = build_tree(preorder, inorder, n);
Node **path = (Node**)malloc(sizeof(Node*) * n);
int path_len = 0;
if (find_node(root, x, path, &path_len)) {
printf("路径为:");
int i;
for (i = 0; i < path_len; i++) {
printf("%c", path[i]->data);
if (i != path_len-1) {
printf("->");
}
}
printf("\n");
} else {
printf("未找到结点 %c\n", x);
}
free(path);
return 0;
}
```
这里的 `build_tree()` 函数和前面的代码是一样的,用于构建二叉树。而 `find_node()` 函数则是用于查找目标结点,并返回从根节点到目标结点的路径。
需要注意的是,这里我们使用了一个 `Node**` 类型的指针 `path` 来存储路径,需要在使用前动态分配内存。查找结束后,需要将其释放以避免内存泄漏。
阅读全文