c语言菜单输入错误的是什么,“二叉树的遍历”问题——C语言菜单实现

题目:二叉树的遍历二叉树以lson-rson链接方式存储,以菜单方式设计并完成功能任务:建立并存储树、输出前序遍历结果、输出中序遍历结果、输出后序遍历结果、交换左右子树、统计高度,其中对于中序、后序的遍历运算要求采用非递归方式。

完整代码#include

#include

typedef struct Node{

char data;

struct Node* left;

struct Node* right;

}Node;

//交互式创建二叉树

Node* QandA_Build(int isRoot){

Node *p;

char ch,ch2;

if (isRoot)

printf("请输入根结点: ");

scanf("%c", &ch);

ch2 = getchar();

if(ch == '#') p = NULL;

else{

isRoot = 0;

p = (Node*)malloc(sizeof(Node));

p->data = ch;

printf("请输入'%c'的左孩子: ", p->data);

p->left = QandA_Build(isRoot);

printf("请输入'%c'的右孩子: ", p->data);

p->right = QandA_Build(isRoot);

}

return p;

}

//先序序列创建二叉树

Node* PreOrder_Build(){

Node *p;

char ch;

scanf("%c", &ch);

if (ch == '#') p = NULL;

else{

p = (Node*)malloc(sizeof(Node));

p->data = ch;

p->left = PreOrder_Build();

p->right = PreOrder_Build();

}

return p;

}

//先序遍历(递归)

void PreOrder(Node* t){

if(!t)

return ;

else{

printf("%c",t->data);

PostOrder(t->left);

PostOrder(t->right);

}

}

//中序遍历(递归)

void InOrder(Node* t){

if(!t)

return ;

else{

InOrder(t->left);

printf("%c",t->data);

InOrder(t->right);

}

}

//后序遍历(递归)

void PostOrder(Node* t){

if(!t)

return ;

else{

PostOrder(t->left);

PostOrder(t->right);

printf("%c",t->data);

}

}

//中序遍历(非递归)

void InOrderByStack(Node* t){

if (t == NULL)

return;

Node* stack[100];

int top = -1;

Node* p = t;

while ( top!=-1 || p ){

//走到最左边,把走过的结点入栈

while(p){

top++;

stack[top] = p;

p = p->left;

}

//栈非空,出栈

if ( top!=-1 ){

p = stack[top];

top--;

printf("%c",p->data);

p = p->right;

}

}

}

//后序遍历(非递归)

void PostOrderByStack(Node* t){

if (t == NULL)

return;

Node* stack[100];

int top = -1;

Node* pCur = t, *pLastVisit = NULL;

//走到最左边

while (pCur){

top++;

stack[top] = pCur;

pCur = pCur->left;

}

while ( top!=-1 ){

//栈非空,则出栈

pCur = stack[top];

top--;

//右边为空 或 右边已被访问,打印

if (pCur->right == NULL || pCur->right == pLastVisit){

printf("%c", pCur->data);

pLastVisit = pCur;

}

else{//右边未被访问

top++;

stack[top] = pCur;

pCur = pCur->right;

while (pCur){

top++;

stack[top] = pCur;

pCur = pCur->left;

}

}

}

printf("\n");

}

//交换左右子树

void Exchange(Node* t){

Node *temp;

if(!t)

return ;

else{

temp = t->left;

t->left = t->right;

t->right = temp;

Exchange(t->left);

Exchange(t->right);

}

}

//统计二叉树高度

int Height(Node* t){

if(t==NULL)

return 0;

else if(t->left==NULL && t->right==NULL)

return 1;

else

{

int Hl,Hr;

Hl=Height(t->left);

Hr=Height(t->right);

if(Hl>Hr)

return Hl+1;

else

return Hr+1;

}

}

//创建二叉树菜单

Node* BuildTree(){

printf("* 欢迎来到二叉树系统,让我们先创建一棵二叉树吧!( òωó)");

int select, flag = 0;

char ch;

Node* tree;

while(!flag){

printf("\n* 1>交互式创建\n* 2>先序序列创建");

printf("\n* 请选择创建二叉树的方式:");

scanf("%d", &select);

ch = getchar();

printf("\n");

switch(select){

case 1:

printf("请按提示输入结点(空子树则输入'#')。\n");

tree = QandA_Build(1);

printf("* 创建成功!\n");

flag = 1;

break;

case 2:

printf("* 请输入先序序列(空子树则输入'#'):");

tree = PreOrder_Build();

printf("* 创建成功!\n");

flag = 1;

break;

default:

printf("* 输入错误!请重新输入!\n");

break;

}

}

return tree;

}

//二叉树功能菜单

int main(){

int select;

Node *tree = BuildTree();

while(1){

printf("\n*******欢迎来到二叉树系统******");

printf("\n***-----1>输出前序遍历------***");

printf("\n***-----2>输出中序遍历------***");

printf("\n***-----3>输出后序遍历------***");

printf("\n***-----4>交换左右子树------***");

printf("\n***-----5>统计二叉树高度----***");

printf("\n***-----6>重新创建二叉树----***");

printf("\n***-----7>退出系统----------***");

printf("\n*******************************");

printf("\n* 请输入数字:");

scanf("%d",&select);

printf("\n");

switch(select){

case 1:

printf("* 先序遍历为:");

PreOrder(tree);

printf("\n");

break;

case 2:

printf("* 中序遍历为:");

InOrderByStack(tree);

printf("\n* (递归)中序遍历为:");

InOrder(tree);

printf("\n");

break;

case 3:

printf("* 后序遍历为:");

PostOrderByStack(tree);

printf("\n* (递归)后序遍历为:");

PostOrder(tree);

printf("\n");

break;

case 4:

Exchange(tree);

printf("* 交换成功!\n");

break;

case 5:

printf("* 该二叉树的高度为:%d\n", Height(tree));

break;

case 6:

tree = BuildTree();

break;

case 7:

printf("* 再见!欢迎下次使用本系统!");

return 0;

default:

printf("* 输入错误!请重新输入!\n");

break;

}

}

}

参考资料

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值