【第十一周 项目1-验证算法(2)二叉树构造算法的验证】

问题及代码:


/*
Copyright (c)2015级,烟台大学 计算机与控制工程学院
All rights reserved.
文件名称:main.cbp
作    者:胡馨月
完成日期:2016年11月10日
版 本 号:v1.0
问题描述:实现二叉树的二叉树构造算法的验证,并测试数据。
输入描述:无
程序输出:测试数据
*/

头文件及功能函数详见【二叉树算法库】
1、由先序序列和中序序列构造二叉树

#include "btree.h" 
 
BTNode *CreateBT1(char *pre,char *in,int n) 
//pre存放先序序列,in存放中序序列,n为二叉树结点个数, 
//本算法执行后返回构造的二叉链的根结点指针 


    BTNode *s; 
    char *p; 
    int k; 
    if (n<=0) return NULL; 
    s=(BTNode *)malloc(sizeof(BTNode));     //创建二叉树结点*s 
    s->data=*pre; 
    for (p=in; p<in+n; p++)                 //在中序序列中找等于*ppos的位置k 
        if (*p==*pre)                       //pre指向根结点 
            break;                          //在in中找到后退出循环 
    k=p-in;                                 //确定根结点在in中的位置 
    s->lchild=CreateBT1(pre+1,in,k);        //递归构造左子树 
    s->rchild=CreateBT1(pre+k+1,p+1,n-k-1); //递归构造右子树 
    return s; 

 
int main() 

    ElemType pre[]="ABDGCEF",in[]="DGBAECF"; 
    BTNode *b1; 
    b1=CreateBT1(pre,in,7); 
    printf("b1:"); 
    DispBTNode(b1); 
    printf("\n"); 
    return 0; 

运行截图:

2、由后序序列和中序序列构造二叉树

#include "btree.h" 
 
BTNode *CreateBT2(char *post,char *in,int n) 
//post存放后序序列,in存放中序序列,n为二叉树结点个数, 
//本算法执行后返回构造的二叉链的根结点指针 

    BTNode *s; 
    char r,*p; 
    int k; 
    if (n<=0) return NULL; 
    r=*(post+n-1);                          //根结点值 
    s=(BTNode *)malloc(sizeof(BTNode));     //创建二叉树结点*s 
    s->data=r; 
    for (p=in; p<in+n; p++)                 //在in中查找根结点 
        if (*p==r) 
            break; 
    k=p-in;                                 //k为根结点在in中的下标 
    s->lchild=CreateBT2(post,in,k);         //递归构造左子树 
    s->rchild=CreateBT2(post+k,p+1,n-k-1);  //递归构造右子树 
    return s; 

 
int main() 

    ElemType in[]="DGBAECF",post[]="GDBEFCA"; 
    BTNode *b2; 
    b2=CreateBT2(post,in,7); 
    printf("b2:"); 
    DispBTNode(b2); 
    printf("\n"); 
    return 0; 

运行截图:

3、由顺序存储结构转为二叉链存储结构

#include <stdio.h> 
#include <malloc.h> 
#include "btree.h" 
#define N 30 
typedef ElemType SqBTree[N]; 
BTNode *trans(SqBTree a,int i) 

    BTNode *b; 
    if (i>N) 
        return(NULL); 
    if (a[i]=='#') 
        return(NULL);           //当节点不存在时返回NULL 
    b=(BTNode *)malloc(sizeof(BTNode)); //创建根节点 
    b->data=a[i]; 
    b->lchild=trans(a,2*i);                 //递归创建左子树 
    b->rchild=trans(a,2*i+1);               //递归创建右子树 
    return(b);                              //返回根节点 

int main() 

    BTNode *b; 
    ElemType s[]="0ABCD#EF#G####################"; 
    b=trans(s,1); 
    printf("b:"); 
    DispBTNode(b); 
    printf("\n"); 
    return 0; 

 运行截图:

知识点总结:

二叉树要明确根节点、左右子树的层次结构,写出相应算法。

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值