先序遍历递归创建二叉树

#include "stdio.h"
#include "stdlib.h"
typedef struct TNode{   //树节点
    char data;
    TNode *lchild,*rchild;
}TNode;
typedef struct LNode{  //栈节点
    char data;
    LNode *next;
}LNode;

void push(LNode *&l,char data){   //入栈
    LNode *p = (LNode*)malloc(sizeof(LNode));
    p->data = data;
    p->next = l->next;
    l->next = p;
}
char pop(LNode *&l){  //出栈
    LNode *p = l->next;
    char tmp = p->data;
    l->next = p->next;
    free(p);
    return tmp;
}

TNode *CreateTree(LNode *&l){   //先序遍历建立二叉树,参数为数据栈l
    if(l->next->data=='*'){    //假如当前首字符为*,那就说明该节点为NULL,返回上一层的createTree函数,并运行上一层函数未运行完的语句
        pop(l);   //抛掉栈顶元素
        return NULL;
    }
    TNode *p = (TNode*)malloc(sizeof(TNode));   //申请新节点
    p->data = pop(l);   //栈顶元素入树
    p->lchild = CreateTree(l);   //将下一个树节点链接到当前节点的左子树上
    p->rchild = CreateTree(l);   
    return p; //当运行到这个语句的时候,说明树的创建已经完成了。把根节点返回
}


void preOrder(TNode *t){  //先序遍历
    if(t!=NULL){
        printf("%c ",t->data);
        preOrder(t->lchild);
        preOrder(t->rchild);
    }
}
void InOrder(TNode *t){  //中序遍历
    if(t!=NULL){
        InOrder(t->lchild);
        printf("%c ",t->data);
        InOrder(t->rchild);
    }
}
void postOrder(TNode *t){  //后序遍历
    if(t!=NULL){
        postOrder(t->lchild);
        postOrder(t->rchild);
        printf("%c ",t->data);
    }
} 

int main(){
    char str[] = {'A','B','C','*','*','D','E','*','G','*','*','F','*','*','*'};  //*表示空
    LNode *s = (LNode*)malloc(sizeof(LNode));
    s->next = NULL;
    for(int i=15;i>=0;i--) push(s,str[i]);  //将树数据入栈
    TNode *t = CreateTree(s);
    preOrder(t);
    InOrder(t);
    getchar();
    return 0;
}

代码中序列对应的树如下图:

 

posted @ 2020-11-23 19:45  封不烦  阅读(480)  评论(0编辑  收藏  举报