第十周-项目3-二叉树的构造

本文介绍了二叉树的构造方法,包括通过先序和中序遍历序列构造二叉树,以及从顺序存储结构转换到二叉链存储结构的过程。提供了一个具体的C++实现示例。
  1. /*               
  2.  * Copyright (c) 2017,烟台大学计算机学院               
  3.  * All right reserved.               
  4.  * 文件名称:main.cpp              
  5.  * 作者:马明祥              
  6.  * 完成日期:2017年11月16日               
  7.  * 版本号:v1.0               
  8.  *               
  9.  * 问题描述:二叉树的构造     
  10.  * 输入描述:标准函数输入               
  11.  * 程序输出:标准函数输出           
  12.   /*  
    #include <stdio.h>
    #include <malloc.h>
    #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;
    }

  13. 由顺序存储结构转为二叉链存储结构:
    #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;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值