这个代码不知道哪里错了,感觉应该是主函数的问题,编译不报错但是运行就会有问题
就是像这样,输入了。但是无结果,本来它应该继续向下显示一行先序遍历结果的,但是它现在什么也不显示,到底是为什么啊,我觉得是主函数少了什么东西。但是又搞不明白是什么东西。
这个是题目
任务:建立二叉树,并实现二叉树的遍历以及求根结点到指定结点的路径。(要用c语言)
功能要求:
建立二叉树存储结构;
对二叉树进行先序、中序、后序、层序遍历,并输出对应遍历序列;
求根结点到指定结点的路径。
界面要求:程序运行后,给出菜单项的内容和输入提示:
建立二叉树存储结构
求二叉树的先序遍历序列
求二叉树的中序遍历序列
求二叉树的后序遍历序列
求二叉树的层序遍历序列
求根结点到指定结点的路径
退出
请选择0-5:
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct BiTNode {//二叉树结点
char data; //数据
struct BiTNode *lchild,*rchild; //左右孩子指针
} BiTNode,*BiTree;
// 链栈
typedef struct STACK{
int data;
struct STACK *next;
}StackNode,*Stack;
int flag; // 标记符
Stack L; // 链栈头节点指针
//************************* 二叉树 ***********************//
// 创建二叉树
int nn=0;
int CreateBiTree(BiTree *T)
{//按先序序列创建二叉树
char data;
scanf("%c",&data);//按先序次序输入二叉树中结点的值(一个字符),'#'表示空树
if (data == '#')
{
*T = NULL;
}
else
{
*T = (BiTree)malloc(sizeof(BiTNode)); nn++;
(*T)->data = data; //生成根结点
CreateBiTree(&(*T)->lchild);//构造左子树
CreateBiTree(&(*T)->rchild);//构造右子树
}
return 0;
}
void Visit(BiTree T)
{//输出
if (T->data != '#')
{
printf("%c ",T->data);
}
}
void PreOrder(BiTree T)
{//先序遍历
if (T != NULL)
{
Visit(T); //访问根节点
PreOrder(T->lchild); //访问左子结点
PreOrder(T->rchild); //访问右子结点
}
}
void InOrder(BiTree T)
{//中序遍历
if (T != NULL)
{
InOrder(T->lchild); //访问左子结点
Visit(T); //访问根节点
InOrder(T->rchild); //访问右子结点
}
}
void PostOrder(BiTree T)
{//后序遍历
if (T != NULL) {
PostOrder(T->lchild); //访问左子结点
PostOrder(T->rchild); //访问右子结点
Visit(T); //访问根节点
}
}
typedef struct BiTNodePost{
BiTree biTree;
char tag;
} BiTNodePost,*BiTreePost;
void LevelOrder(BiTree T) {//层次遍历
BiTree p;
BiTree *queue;
int h=0,t=0,n=0;
if (T == NULL) return;
p=T;
queue=(BiTree *)malloc(nn*sizeof(BiTree));
queue[t]=p;t=(t+1)%10;n++;//根节点入队
while (n) { //队列不空循环
p=queue[h]; //对头元素出队
printf("%c ",p->data); //访问p指向的结点
h=(h+1)%10;n--; //退出队列
if (p->lchild != NULL) {//左子树不空,将左子树入队
queue[t]=p->lchild;t=(t+1)%10;n++;
}
if (p->rchild != NULL) {//右子树不空,将右子树入队
queue[t]=p->rchild;t=(t+1)%10;n++;
}
}
free(queue);
}
//************************* 链 栈 *********************//
// 入栈
void PushStack(int x)
{
Stack top;
top = (Stack)malloc(sizeof(StackNode));
top->data = x;
top->next = L; // 第一次是让一开始的头节点存入元素,尾巴指向NULL已经初始化好
L = top; // 之后便是创建新的链栈节点和之前的串起来
}
// 出栈
int PopStack()
{
int x;
if(L->next==NULL) // 栈空
{
printf("出栈完毕\n");
exit(-1);
}else{
Stack p;
x = L->data;
p = L; // 让原来的L变成P
L = p->next; // 原来头节点next指向的变成新的头节点
free(p); // 释放原来的头节点
return x; // 返回原来头节点里头的元素
}
}
// 进入二叉树搜索特定节点
void CherkNode(BiTree T,int dat)
{
if(T==NULL)
{
return;
}
if(flag==1) // 标记符flag 还是1时,表示还没找到要找的节点
{
printf("入栈元素为: %d\n",T->data);
PushStack(T->data); // 入栈
}
if(T->data == dat) // 已经在二叉树中遍历到要找的节点元素
{
printf("元素找到,元素为: %d\n",T->data);
flag = 0;
return;
}
CherkNode(T->lchild,dat); // 遍历这个节点左子树,为NULL时才结束递归,返回上一级节点
CherkNode(T->rchild,dat); // 遍历这个节点的右子树,为NULL时返回上一级节点
if(flag==1) // 递归遍历二叉树每条路径中寻找,由于遍历一个节点
{ // 就会让元素入栈,以便将后面元素不是要找路径之中的元素,从栈中清除
printf("出栈元素: %d\n",T->data);
PopStack(); // 清除非要寻找路径上的栈中元素
}
}
// 搜索路径
void SearchPath(BiTree T,int data)
{
int temp[30]; // 用来存最后找到的路径各个节点里头的数据
int i;
flag = 1; // 标记符
L = (Stack)malloc(sizeof(StackNode)); // 分配空间给指针
L->next = NULL; // 让第一个节点指针指向NULL,最后也就是栈底指针
if(T==NULL) // 空树
{
return;
}
CherkNode(T,data); // 搜索二叉树中要找的节点,进行入栈出栈操作
for(i=0;L->next;i++)
{
temp[i] = PopStack(); // 找到的路径元素逆序存放在数组temp[]中
}
printf("路径寻找成功,路径如下:\n");
for(i--;i>=0;i--)
{
printf("%d ",temp[i]);
}
}
int main()
{
printf("1.建立二叉树存储结构\n2.求二叉树的先序遍历序列\n3.求二叉树的中序遍历序列\n4.求二叉树的后序遍历序列\n5.求二叉树的层序遍历序列\n6.求根结点到指定结点的路径\n0.退出\n");
BiTree T;
printf("请输入要选择的功能:");
setlocale(LC_ALL,"chs");
int choose;
scanf("%d",&choose);
switch(choose)
{
case 1:{
printf("请输入二叉树:");
CreateBiTree(&T);
}
case 2:{
printf("先序遍历:");
PreOrder(T);
printf("\n");
}
case 3:{
printf("中序遍历:");
InOrder(T);
printf("\n");
}
case 4:{
printf("后序遍历:");
PostOrder(T);
printf("\n");
}
case 5:{
printf("层次遍历:");
LevelOrder(T);
printf("\n");
}
case 6:{BiTree T; // 创建二叉树指针
int Node;
printf("请输入第一个节点(输入-1表示该节点下无其他节点)\n");
CreateBiTree(&T);
printf("先序遍历如下:\n");
PreOrder(T);
putchar('\n');
printf("请输入你要找的特定节点:\n");
scanf("%d",&Node);
SearchPath(T,Node); // 开始搜索节点
return 0;
}
case 0:printf("感谢使用本软件!已正常退出,按任意键结束!\n");break;
default:printf("无效操作");
}
}