c语言while switch,二叉树的建立,采取while switch()后执行起来就不对了,大神们帮忙看看...

二叉树的建立,采用while switch()后执行起来就不对了,大神们帮忙看看

182402105.gif

#include

#include

#include

#define OVERFLOW -1

typedef char TElemType;

typedef struct BitNode

{

TElemType data;

struct BitNode *lchild,*rchild;

}BitNode,*BitTree;

typedef struct QNode

{

BitNode data;

struct QNode *next;

}QNode,*Queueptr;

typedef struct

{

Queueptr front;

Queueptr rear;

}LinkQueue;

BitTree BitTreeInit(BitTree BT)

{

BT=(BitTree)malloc(sizeof(BitNode));

BT=NULL;

return BT;

}

BitTree BitTreeCreat(BitTree &BT)

{

char c;

scanf("%c",&c);

if(c==' ')  BT=NULL;

else

{

if(!(BT=(BitTree)malloc(sizeof(BitNode))))

exit(OVERFLOW);

BT->data=c;

BitTreeCreat(BT->lchild);

BitTreeCreat(BT->rchild);

}

return BT;

}

void BitTreeEmpty(BitTree BT)

{

if(!BT) printf("树为空!\n");

else printf("树非空!\n");

}

void visit(BitTree BT)

{

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

}

void PreOrderTraverse(BitTree BT)

{

if(BT)

{

visit(BT);

PreOrderTraverse(BT->lchild);

PreOrderTraverse(BT->rchild);

}

}

void InOrderTraverse(BitTree BT)

{

if(BT)

{

InOrderTraverse(BT->lchild);

visit(BT);

InOrderTraverse(BT->rchild);

}

}

void PostOrderTraverse(BitTree BT)

{

if(BT)

{

PostOrderTraverse(BT->lchild);

PostOrderTraverse(BT->rchild);

visit(BT);

}

}

void InitQueue(LinkQueue *Q)

{

Q->front=Q->rear=(Queueptr)malloc(sizeof(QNode));

if(!Q->front) exit(OVERFLOW);

Q->front->next=NULL;

}

int QueueEmpty(LinkQueue *Q)

{

if(Q->front==Q->rear) return 1;//是==不是=

else return 0;

}

void EnQueue(LinkQueue *Q,BitNode e)

{

QNode *p;

p=(Queueptr)malloc(sizeof(QNode));

if(!p) exit(OVERFLOW);

p->data=e;

p->next=NULL;

Q->rear->next=p;

Q->rear=p;

}

void DeQueue(LinkQueue *Q,BitTree e)

{

QNode *p;

p=Q->front->next;

*e=p->data;

Q->front->next=p->next;

if(Q->rear==p) Q->rear=Q->front;

free(p);

}

void BFSTraverse(BitTree BT)

{

BitNode m;

LinkQueue Q;

InitQueue(&Q);

EnQueue(&Q,*BT);

while(!QueueEmpty(&Q))

{

DeQueue(&Q,&m);

visit(&m);

if(m.lchild) EnQueue(&Q,*(m.lchild));

if(m.rchild) EnQueue(&Q,*(m.rchild));

}

}

int BitTreeDepth(BitTree BT)

{

int dep1,dep2;

if(BT==NULL) return 0;

else

{

dep1=BitTreeDepth(BT->lchild);

dep2=BitTreeDepth(BT->rchild);

if(dep1>dep2)  return dep1;

else return dep2;

}

}

void BitCountleaf(BitTree BT,int *count)

{

if(BT)

{

if(!BT->lchild&&!BT->rchild)

(*count)++;

BitCountleaf(BT->lchild,count);

BitCountleaf(BT->rchild,count);

}

}

void BitTreeClear(BitTree &BT)

{

if(BT)

{

BitTreeClear(BT->lchild);

BitTreeClear(BT->rchild);

free(BT);

BT=NULL;

}

}

int main()

{

int i=1,j,count=0;

BitTree BT;

while(i!=0){

printf("-----------------欢迎使用-------------------\n");

printf("请选择要进行的操作\n");

printf("1.初始化一棵树  2.建立一棵树     3.判断树是否为空\n");

printf("4.按先序遍历树  5.按中序遍历树   6.按后序遍历树\n");

printf("7.按层次遍历树  8.求树的深度     9.求树的叶子节点个数\n");

printf("0.把树清空\n");

printf("-----------------感谢使用-------------------\n");

scanf("%d",&j);

switch(j){

case 1:BT=BitTreeInit(BT); break;

case 2:printf("请输入二叉树(空格代表树的元素为空,最后输入空格键结束输入):\n");

BT=BitTreeCreat(BT);break;

case 3:BitTreeEmpty(BT);break;

case 4:printf("先序遍历: ");

PreOrderTraverse(BT);printf("\n");break;

case 5:printf("中序遍历:");

InOrderTraverse(BT);printf("\n");break;

case 6: printf("后序遍历:");

PostOrderTraverse(BT);printf("\n");break;

case 7:printf("层次遍历:");

BFSTraverse(BT);printf("\n");break;

case 8:printf("该树的深度是%d\n",BitTreeDepth(BT));break;

case 9:BitCountleaf(BT,&count);

printf("二叉树的叶子节点个数为:%d\n",count);break;

case 0:BitTreeClear(BT);break;

return 0;

}

}

}

------解决思路----------------------

仅供参考:#include 

#include 

#include 

#include 

using namespace std;

typedef struct BiTNode {//二叉树结点

char data;                      //数据

struct BiTNode *lchild,*rchild; //左右孩子指针

} BiTNode,*BiTree;

int CreateBiTree(BiTree &T) {//按先序序列创建二叉树

char data;

scanf("%c",&data);//按先序次序输入二叉树中结点的值(一个字符),‘#’表示空树

if (data == '#') {

T = NULL;

} else {

T = (BiTree)malloc(sizeof(BiTNode));

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);               //访问根节点

}

}

void PreOrder2(BiTree T) {//先序遍历(非递归)

//访问T->data后,将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,再先序遍历T的右子树。

stack stack;

BiTree p = T;//p是遍历指针

while (p

------解决思路----------------------

!stack.empty()) {   //栈不空或者p不空时循环

if (p != NULL) {

stack.push(p);          //存入栈中

printf("%c ",p->data);  //访问根节点

p = p->lchild;          //遍历左子树

} else {

p = stack.top();        //退栈

stack.pop();

p = p->rchild;          //访问右子树

}

}

}

void InOrder2(BiTree T) {//中序遍历(非递归)

//T是要遍历树的根指针,中序遍历要求在遍历完左子树后,访问根,再遍历右子树。

//先将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,访问T->data,再中序遍历T的右子树。

stack stack;

BiTree p = T;//p是遍历指针

while (p

------解决思路----------------------

!stack.empty()) {   //栈不空或者p不空时循环

if (p != NULL) {

stack.push(p);          //存入栈中

p = p->lchild;          //遍历左子树

} else {

p = stack.top();        //退栈,访问根节点

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

stack.pop();

p = p->rchild;          //访问右子树

}

}

}

typedef struct BiTNodePost{

BiTree biTree;

char tag;

} BiTNodePost,*BiTreePost;

void PostOrder2(BiTree T) {//后序遍历(非递归)

stack stack;

BiTree p = T;//p是遍历指针

BiTreePost BT;

while (p != NULL

------解决思路----------------------

!stack.empty()) {//栈不空或者p不空时循环

while (p != NULL) {//遍历左子树

BT = (BiTreePost)malloc(sizeof(BiTNodePost));

BT->biTree = p;

BT->tag = 'L';//访问过左子树

stack.push(BT);

p = p->lchild;

}

while (!stack.empty() && (stack.top())->tag == 'R') {//左右子树访问完毕访问根节点

BT = stack.top();

stack.pop();//退栈

printf("%c ",BT->biTree->data);

}

if (!stack.empty()) {//遍历右子树

BT = stack.top();

BT->tag = 'R';//访问过右子树

p = BT->biTree;

p = p->rchild;

}

}

}

void LevelOrder(BiTree T) {//层次遍历

if (T == NULL) return;

BiTree p = T;

queue queue;//队列

queue.push(p);//根节点入队

while (!queue.empty()) {    //队列不空循环

p = queue.front();      //对头元素出队

printf("%c ",p->data);  //访问p指向的结点

queue.pop();            //退出队列

if (p->lchild != NULL) {//左子树不空,将左子树入队

queue.push(p->lchild);

}

if (p->rchild != NULL) {//右子树不空,将右子树入队

queue.push(p->rchild);

}

}

}

int main() {

BiTree T;

setlocale(LC_ALL,"chs");

CreateBiTree(T);

printf("先序遍历        :");PreOrder  (T);printf("\n");

printf("先序遍历(非递归):");PreOrder2 (T);printf("\n");

printf("\n");

printf("中序遍历        :");InOrder   (T);printf("\n");

printf("中序遍历(非递归):");InOrder2  (T);printf("\n");

printf("\n");

printf("后序遍历        :");PostOrder (T);printf("\n");

printf("后序遍历(非递归):");PostOrder2(T);printf("\n");

printf("\n");

printf("层次遍历        :");LevelOrder(T);printf("\n");

return 0;

}

//ABC##DE#G##F###

//先序遍历        :A B C D E G F

//先序遍历(非递归):A B C D E G F

//

//中序遍历        :C B E G D F A

//中序遍历(非递归):C B E G D F A

//

//后序遍历        :C G E F D B A

//后序遍历(非递归):C G E F D B A

//

//层次遍历        :A B C D E F G

//

///       A

///      /

///     B

///    / \

///   C   D

///      / \

///     E   F

///      \

///       G

------解决思路----------------------

修改如下:

#include

#include

#include

#define OVERFLOW -1

typedef char TElemType;

typedef struct BitNode

{

TElemType data;

struct BitNode *lchild, *rchild;

}BitNode, *BitTree;

typedef struct QNode

{

BitNode data;

struct QNode *next;

}QNode, *Queueptr;

typedef struct

{

Queueptr front;

Queueptr rear;

}LinkQueue;

//初始化,就是建一棵空树?

BitTree BitTreeInit(BitTree *pBT)

{

//BT = (BitTree)malloc(sizeof(BitNode));

*pBT = NULL;

return *pBT;

}

BitTree BitTreeCreat(BitTree *pBT)

{

char c;

scanf("%c", &c);

getchar();   //zx 读入回车

if (c == ' ')  *pBT = NULL;

else

{

if (!(*pBT = (BitTree)malloc(sizeof(BitNode))))

exit(OVERFLOW);

(*pBT)->data = c;

printf("%c的左节点:", c);

BitTreeCreat(&((*pBT)->lchild));

printf("%c的右节点:", c);

BitTreeCreat(&((*pBT)->rchild));

}

return *pBT;

}

void BitTreeEmpty(BitTree BT)

{

if (!BT) printf("树为空!\n");

else printf("树非空!\n");

}

void visit(BitTree BT)

{

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

}

void PreOrderTraverse(BitTree BT)

{

if (BT)

{

visit(BT);

PreOrderTraverse(BT->lchild);

PreOrderTraverse(BT->rchild);

}

}

void InOrderTraverse(BitTree BT)

{

if (BT)

{

InOrderTraverse(BT->lchild);

visit(BT);

InOrderTraverse(BT->rchild);

}

}

void PostOrderTraverse(BitTree BT)

{

if (BT)

{

PostOrderTraverse(BT->lchild);

PostOrderTraverse(BT->rchild);

visit(BT);

}

}

void InitQueue(LinkQueue *Q)

{

Q->front = Q->rear = (Queueptr)malloc(sizeof(QNode));  //zx 队头、队尾指向同一节点?

if (!Q->front) exit(OVERFLOW);

Q->front->next = NULL;

}

int QueueEmpty(LinkQueue *Q)

{

if (Q->front == Q->rear) return 1;//是==不是=

else return 0;

}

void EnQueue(LinkQueue *Q, BitNode e)

{

QNode *p;

p = (Queueptr)malloc(sizeof(QNode));

if (!p) exit(OVERFLOW);

p->data = e;

p->next = NULL;

Q->rear->next = p;

Q->rear = p;

}

void DeQueue(LinkQueue *Q, BitTree e)

{

QNode *p;

p = Q->front->next;

*e = p->data;

Q->front->next = p->next;

if (Q->rear == p) Q->rear = Q->front;

free(p);

}

//广度优先遍历

void BFSTraverse(BitTree BT)

{

BitNode m;

LinkQueue Q;

InitQueue(&Q);

EnQueue(&Q, *BT);

while (!QueueEmpty(&Q))

{

DeQueue(&Q, &m);

visit(&m);

if (m.lchild) EnQueue(&Q, *(m.lchild));

if (m.rchild) EnQueue(&Q, *(m.rchild));

}

}

int BitTreeDepth(BitTree BT)  //求树的深度

{

int dep1, dep2;

if (BT == NULL) return 0;

else

{

dep1 = BitTreeDepth(BT->lchild);

dep2 = BitTreeDepth(BT->rchild);

if (dep1 > dep2)  return dep1 + 1;

else return dep2 + 1;

}

}

void BitCountleaf(BitTree BT, int *count)

{

if (BT)

{

if (!BT->lchild && !BT->rchild)

(*count)++;

BitCountleaf(BT->lchild, count);

BitCountleaf(BT->rchild, count);

}

}

void BitTreeClear(BitTree BT)

{

if (BT)

{

BitTreeClear(BT->lchild);

BitTreeClear(BT->rchild);

free(BT);

BT = NULL;

}

}

int main()

{

int i = 1, j, count = 0;

BitTree BT = NULL;

while (1) {

printf("-----------------欢迎使用-------------------\n");

printf("请选择要进行的操作\n");

printf("1.初始化一棵树  2.建立一棵树     3.判断树是否为空\n");

printf("4.按先序遍历树  5.按中序遍历树   6.按后序遍历树\n");

printf("7.按层次遍历树  8.求树的深度     9.求树的叶子节点个数\n");

printf("0.把树清空\n");

printf("-----------------感谢使用-------------------\n");

scanf("%d", &j);

getchar();

switch (j) {

case 1:BT = BitTreeInit(&BT); break;

case 2:printf("请输入二叉树(空格代表树的元素为空,最后输入空格键结束输入):\n");

BT = BitTreeCreat(&BT); break;

case 3:BitTreeEmpty(BT); break;

case 4:printf("先序遍历: ");

PreOrderTraverse(BT); printf("\n"); break;

case 5:printf("中序遍历:");

InOrderTraverse(BT); printf("\n"); break;

case 6: printf("后序遍历:");

PostOrderTraverse(BT); printf("\n"); break;

case 7:printf("层次遍历:");

BFSTraverse(BT); printf("\n"); break;

case 8:printf("该树的深度是%d\n", BitTreeDepth(BT)); break;

case 9:BitCountleaf(BT, &count);

printf("二叉树的叶子节点个数为:%d\n", count); break;

case 0:BitTreeClear(BT); break;

default: return 0;  //zx

}

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值