二叉树实现

二叉链表(C++)

采用先序序列建立二叉链表,字符串:A B C # # D E # G # # F # # #

#include <stdio.h>
#include <stdlib.h>
#define ElemType char
#define MAXSIZE 20
typedef struct BiTNode{
    ElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;//二叉树的二叉链表结构体
typedef struct {
    BiTree a[MAXSIZE];
    int top;
}Stack;//用于存储中间节点的
typedef struct {
    BiTree b[MAXSIZE];
    int front,rear;
}Queue;//实现层次遍历所需要的队列
void InitBiTree(BiTree &T){
    ElemType ch;
    scanf("%c",&ch);//按次序输入二叉树中节点的值
    getchar();//消除空格符
    if(ch=='#'){
        T=NULL;
    }
    else{
        T=(BiTree)malloc(sizeof(BiTNode));
        T->data=ch;
        InitBiTree(T->lchild);
        InitBiTree(T->rchild);
    }
}//用递归创建一个二叉树
void visit(BiTree &T){
    if(T!=NULL){
        printf("%c ",T->data);
    }
}//visit是对数据元素操作的应用函数
void PreOrder(BiTree &T){
    if(T){
        visit(T);
        PreOrder(T->lchild);
        PreOrder(T->rchild);
    }
}//递归先序遍历
void PreOrder2(BiTree &T){
    Stack s;
    BiTree p;
    s.top=-1;
    if(!T){return ;}
    else{
        s.top++;
        s.a[s.top]=T;
        while(s.top!=-1){
            p=s.a[s.top];
            visit(p);
            s.top--;
            if(p->rchild){
                s.top++;
                s.a[s.top]=p->rchild;
            }
            if(p->lchild){
                s.top++;
                s.a[s.top]=p->lchild;
            }
        }
    }
}//非递归先序遍历
void InOrder(BiTree &T){
    if(T){
        InOrder(T->lchild);
        visit(T);
        InOrder(T->rchild);
    }
}//递归中序遍历
void InOrder2(BiTree &T){
    Stack s;
    s.top=-1;
    BiTree p,q;
    p=T;
    while(p||s.top!=-1){
        if(p){
            s.top++;
            s.a[s.top]=p;
            p=p->lchild;
        }
        else{
            q=s.a[s.top];
            visit(q);
            s.top--;
            p=q;
            p=p->rchild;
        }
    }
}//非递归中序遍历
void PostOrder(BiTree &T){
    if(T){
        PostOrder(T->lchild);
        PostOrder(T->rchild);
        visit(T);
    }
}//后序遍历
void PostOrder2(BiTree &T){
    Stack s;
    s.top=-1;
    BiTree p,q;
    p=T;
    do{
        while(p){
            s.top++;
            s.a[s.top]=p;
            p=p->lchild;
        }
        q=NULL;
        while(s.top!=-1){
            p=s.a[s.top];
            if(p->rchild==q){//判断右节点是否存在或是否已经访问
                visit(p);
                s.top--;
                q=p;
            }
            else{
                p=p->rchild;
                break;
            }
        }
    }while(s.top!=-1);
}//非递归后序遍历
void LevelOrder(BiTree &T){
    Queue q;
    q.front=0;
    q.rear=0;
    BiTree p;
    q.b[q.rear]=T;//现将根入队
    q.rear++;
    while(q.front!=q.rear){
        p=q.b[q.front];
        visit(q.b[q.front]);
        q.front++;
        if(p->lchild){
            q.b[q.rear]=p->lchild;
            q.rear++;
        }
        if(p->rchild){
            q.b[q.rear]=p->rchild;
            q.rear++;
        }
    }
}//层次遍历
int main(){
    BiTree T;
    printf("输入二叉树:");
    InitBiTree(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;
}

 

posted on 2019-07-29 21:37  一仟零一夜丶  阅读(202)  评论(0)    收藏  举报