前序创建二叉树+ 前序/中序/后序遍历二叉树

二叉树的建立:

如果要在内存中建立一个如下左图这样的树,wield能让每个结点确认是否有左右孩子,我们对它进行扩展,变成如下右图的样子,也就是将二叉树中的每个结点的空指针引出一个虚结点,其值为一个特定值,比如#,称之为扩展二叉树。扩展二叉树就可以做到一个遍历序列确定一棵二叉树了。如前序遍历序列为AB#D##C##

    有了这样的准备,就可以看看如何生成一棵二叉树了。假设二叉树的结点均为一个字符,把刚才前序遍历序列AB#D##C##用键盘挨个输入,实现的算法如下所示。

精简版

#include<iostream>
#include<stdlib.h>
#include<stdio.h>

using namespace std;
struct bitree{
    char data ;
    struct bitree * lchild , *rchild ;
};
//设置空二叉树
void setnull(struct bitree * bt){
    bt->lchild = NULL ;
    bt->rchild = NULL ;
}



//先序创建二叉树操作
struct bitree * createbitree(){
    char c ;
    struct bitree * bt ;
    scanf("%c" , & c) ;
    if(c == '#')
        bt = NULL ; // 又是因为 bt == NULL 造成的错误,导致调试了一下午
    else{
        bt = (struct bitree *) malloc(sizeof(struct bitree)) ;
        bt->data = c ;
        bt->lchild = createbitree() ;
        bt->rchild = createbitree() ;
    }
    return bt ; // 返回根结点
}
//前序遍历二叉树
void preorder(struct bitree * root){
    if(root != NULL){
        printf("%c\n" , root->data) ;
        preorder(root->lchild) ;
        preorder(root->rchild) ;
    }
}

// 中序遍历二叉树
void inorder(struct bitree * root){
    if(root != NULL){
        inorder(root ->lchild) ;
        printf("%c\n" , root->data) ;
        inorder(root->rchild) ;
    }
}

//后序遍历二叉树

void postorder(struct bitree * root){
    if(root != NULL){
        postorder(root->lchild) ;
        postorder(root->rchild) ;
        printf("%c\n" , root->data) ;
    }
}
int main(){
    int n = 10 ;
    while(n--){
        struct bitree * t ;
        cout<<"前序建立二叉树"<<endl;
        cout<<"请输入ABD#F###CE#G### 或者AB#D##C## "<< endl;
        t = createbitree() ;
        cout<<"前序遍历二叉树" << endl;
        preorder(t) ;
        cout<<"中序遍历二叉树"<<endl;
        inorder(t) ;
        cout<<"后序遍历二叉树" << endl;
        postorder(t) ;
        getchar( ) ;
    }
   return 0 ;
}


 
输出版
#include<iostream>
#include<stdlib.h>
#include<stdio.h>

using namespace std;
struct bitree{
    char data ;
    struct bitree * lchild , *rchild ;
};
//设置空二叉树
void setnull(struct bitree * bt){
    bt->lchild = NULL ;
    bt->rchild = NULL ;
}



//先序创建二叉树操作
struct bitree * createbitree(){
    char c ;
    struct bitree * bt ;
    scanf("%c" , & c) ;
    //printf("输入的c是%c\n" ,c) ;
    if(c == '#')
        bt = NULL ; // 又是因为 bt == NULL 造成的错误,导致调试了一下午
    else{
        bt = (struct bitree *) malloc(sizeof(struct bitree)) ;
        bt->data = c ;
       // cout<<"bt->Data = " << c<< endl;
        bt->lchild = createbitree() ;
       // cout<<bt->data<< "--- bt-> lchild = " << bt->lchild<<endl ;
        bt->rchild = createbitree() ;
      //  cout<<bt->data<< "--- bt-> rchild = " <<bt->rchild << endl;
    }
    //cout<<c << "--bt--"<<bt << endl;
    return bt ; // 返回根结点
}

//前序遍历二叉树
void preorder(struct bitree * root){
    //cout<<"root = " << root << endl ;
    if(root != NULL)
        cout<<"****root->data = " << root->data << endl;
    else
        cout<<"##############"<<endl;
    if(root != NULL){
        printf("%c\n" , root->data) ;
        preorder(root->lchild) ;
        preorder(root->rchild) ;
    }
}

// 中序遍历二叉树
void inorder(struct bitree * root){
     if(root != NULL)
        cout<<"****root->data = " << root->data << endl;
    else
        cout<<"##############"<<endl;
    if(root != NULL){
        inorder(root ->lchild) ;
        printf("%c\n" , root->data) ;
        inorder(root->rchild) ;
    }
}

//后序遍历二叉树

void postorder(struct bitree * root){
     if(root != NULL)
        cout<<"****root->data = " << root->data << endl;
    else
        cout<<"##############"<<endl;
    if(root != NULL){
        postorder(root->lchild) ;
        postorder(root->rchild) ;
        printf("%c\n" , root->data) ;
    }
}
int main(){
    int n = 10 ;
    while(n--){
        struct bitree * t ;
        cout<<"前序建立二叉树"<<endl;
        cout<<"请输入ABD#F###CE#G### 或者AB#D##C## "<< endl;
        t = createbitree() ;
        cout<<"前序遍历二叉树" << endl;
        preorder(t) ;
        cout<<"中序遍历二叉树"<<endl;
        inorder(t) ;
        cout<<"后序遍历二叉树" << endl;
        postorder(t) ;
        getchar( ) ;
    }



   return 0 ;
}



  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值