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


#include <stdio.h>

#include <stdlib.h>
#define maxsize 100

///二叉树结点
typedef struct BitNode{
    char data;
    struct BitNode *lchild,*rchild;
}BitNode,*BitTree;

///按先序序列创建二叉树
BitTree CreateBitTree(BitNode *T){
    char data;          ///按先序次序输入二叉树中结点的值(一个字符),‘#’表示空树
    scanf("%c",&data);
    if(data=='#'){
        T=NULL;
    }
    else{
        T=(BitTree)malloc(sizeof(BitNode));
        T->data=data;       ///生成根结点
        T->lchild=CreateBitTree(T->lchild);   ///构造左子树
        T->rchild=CreateBitTree(T->rchild);   ///构造右子树
    }
    return T;
}
///访问
void visit(BitNode *T){
    if(T->data!='#')
        printf("%c ",T->data);
}
///先序递归访问
void PreOrderTraver(BitTree T){
    if(T!=NULL){
        visit(T);
        PreOrderTraver(T->lchild);
        PreOrderTraver(T->rchild);
    }
}
///中序递归访问
void InOrderTraver1(BitNode *T){
    if(T!=NULL){
        InOrderTraver1(T->lchild);
        visit(T);
        InOrderTraver1(T->rchild);
    }
}
///中序非递归访问
void InOrderTraver2(BitTree T){
    BitNode *p;
    p=T;
    BitTree s[maxsize];
    int i=0;
    do{
        while(p!=NULL){
            s[i]=p;
            p=p->lchild;
            i++;
        }
        if(i!=0){
            p=s[i-1];i--;
            visit(p);
            p=p->rchild;
        }
    }while(i!=0||p!=NULL);
}
///后序递归访问
void AfterOrderTraver1(BitTree T){
    if(T!=NULL){
        AfterOrderTraver1(T->lchild);
        AfterOrderTraver1(T->rchild);
        visit(T);
    }
}
///后序非递归访问
typedef struct St{
    struct BTNode* data[maxsize];
    int top;
}stack;
void AfterOrderTraver2(BitTree T){
    stack s;
    BitNode *p;
    p=T;
    int tag[maxsize/2];
    s.top=0;
    while(s.top!=0||p){
        while(p!=NULL){
            s.data[s.top++]=p;
            tag[s.top-1]=0;
            p=p->lchild;
        }
        while(s.top!=0&&tag[s.top-1]==1){
            p=s.data[--s.top];
            visit(p);
        }
        if(s.top!=0){
            tag[s.top-1]=1;
            p=s.data[s.top-1];
            p=p->rchild;
        }
        else
            break;
    }

}
///求树的高度
int TreeHeight(BitTree T){
     int rHeight=0;
     int lHeight=0;
     if(T==NULL)
        return -1;
     if(T->lchild!=NULL)
        lHeight=TreeHeight(T->lchild);
     else
        lHeight=0;
     if(T->rchild!=NULL)
        rHeight=TreeHeight(T->rchild);
     else
        rHeight=0;
     return (rHeight>lHeight)?(rHeight+1):(lHeight+1);
}
///交换左右子树
BitTree exchange(BitTree T){
    BitTree temp;
    if(T){
        temp=T->lchild;
        T->lchild=T->rchild;
        T->rchild=temp;
        exchange(T->lchild);
        exchange(T->rchild);
    }
    return T;
}

int main(){
    BitTree T;
    printf("---------------二叉树的遍历问题---------------\n");
    printf("\n\t按先序序列创建二叉树:");
    T=CreateBitTree(T);
    printf("\n\t先序递归遍历:");
    PreOrderTraver(T);
    printf("\n\n\t中序递归遍历:");
    InOrderTraver1(T);
    printf("\n\n\t中序非递归遍历:");
    InOrderTraver2(T);
    printf("\n\n\t后序递归遍历:");
    AfterOrderTraver1(T);
    printf("\n\n\t后序非递归遍历:");
    AfterOrderTraver2(T);
    int i;
    i=TreeHeight(T);
    printf("\n\n\t该树的高度:%d\n",i);
    T=exchange(T);
    printf("\n\t交换左右子树后先序递归遍历:");
    PreOrderTraver(T);
    printf("\n");
    return 0;
}


二叉树的创建以及各种遍历

相关文章:

  • 2021-11-12
  • 2021-04-06
  • 2021-07-15
  • 2022-12-23
  • 2021-10-03
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-09-03
  • 2021-05-21
  • 2022-12-23
  • 2021-06-03
  • 2021-05-29
相关资源
相似解决方案