33,008
社区成员
发帖
与我相关
我的任务
分享
/*********************************************************************************
文件:输出从根结点到指定节点的路径
输入:完全二叉树的顺序输入结点信息,空节点输入'#',输入ENTER表示结束
日期:2019年10月8日13:55:17
作者:wowpH
*********************************************************************************/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_TREE_NODE 100
#define NODE_NULL '#'
typedef struct BiTNode {
char data;
struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;
char stack[MAX_TREE_NODE + 1];
int stackTop = 0;
void createBiTree(BiTree* root, char str[], int index);
BiTree createBiTNode();
int find(BiTree root, char ch);
int main() {
printf("1、层序输入完全二叉树\n");
printf("2、空节点用'%c'表示\n", NODE_NULL);
printf("3、输入Enter结束\n");
printf("4、输入exit表示退出\n\n");
char str[MAX_TREE_NODE + 1];
printf("输入完全二叉树:");
while (scanf("%s", &str) != EOF) {
BiTree root = NULL;
str[strlen(str)] = '\0';// 可以不要这一行
if (strcmp(str, "exit") == 0) {
break;
}
createBiTree(&root, str, 0);
printf("\n输入要查找的结点:");
char ch;
do {
ch = getchar();
} while (ch == '\n' || ch == NODE_NULL);
stackTop = 0;
if (find(root, ch) == 0) {
printf("\n未找到结点'%c'\n\n", ch);
} else {
printf("\n路径:");
printf("%c", stack[0]);
for (int i = 1; i < stackTop; ++i) {
printf(" %c", stack[i]);
}
printf("\n\n");
}
printf("输入完全二叉树:");
}
return 0;
}
void createBiTree(BiTree* root, char str[], int index) {
if (index >= strlen(str) || str[index] == NODE_NULL) {
return;
}
*root = createBiTNode();
(*root)->data = str[index];
createBiTree(&((*root)->lchild), str, index * 2 + 1);
createBiTree(&((*root)->rchild), str, index * 2 + 2);
}
BiTree createBiTNode() {
BiTree bt = (BiTree)malloc(sizeof(BiTNode));
if (bt == NULL) {
printf("申请结点失败");
return NULL;
}
bt->lchild = NULL;
bt->rchild = NULL;
return bt;
}
int find(BiTree root, char ch) {
if (stackTop > 0 && stack[stackTop - 1] == ch) {
return 1;
}
if (root == NULL) {
return 0;
}
stack[stackTop++] = root->data;
if (find(root->lchild, ch) == 1 || find(root->rchild, ch) == 1) {
return 1;
}
stack[--stackTop] = '\0';
return 0;
}
/*
1、层序输入完全二叉树
2、空节点用'#'表示
3、输入Enter结束
4、输入exit表示退出
输入完全二叉树:ABCDEF###G
输入要查找的结点:G
路径:A B E G
输入完全二叉树:ABCDEF###G
输入要查找的结点:F
路径:A C F
输入完全二叉树:exit
请按任意键继续. . .
*/