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

二叉树的建立,采用while switch()后执行起来就不对了,大神们帮忙看看
二叉树的建立,采取while switch()后执行起来就不对了,大神们帮忙看看
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#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 <iostream>
#include <stack>
#include <queue>
#include <locale.h>
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<BiTree> 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<BiTree> 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<BiTreePost> 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<BiTree> 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<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#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;
}