1. 程式人生 > >二叉樹演算法驗證(2)

二叉樹演算法驗證(2)

/*  

*Copyright  (c)2017,煙臺大學計算機與控制工程學院      

*All rights reservrd.      

*檔名稱 :test.cpp      

*作者:杜昕曄  

*完成時間:2017年12月08日      

*版本號:v1.0      

*問題描述:二叉樹構造演算法的驗證

問題及程式碼:

利用btreee.h見演算法庫

1.由先序序列和中序序列構造二叉樹

#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;
}
執行結果:

2.由中序序列和後序序列構造二叉樹:

#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;
}
執行結果: