1. 程式人生 > >演算法驗證-二叉樹構造演算法

演算法驗證-二叉樹構造演算法

/*          
 * Copyright (c) 2017,煙臺大學計算機學院          
 * All right reserved.          
 * 檔名稱:main.cpp         
 * 作者:於嵩          
 * 完成日期:2017年11月7日          
 * 版本號:v1.0          
 *          
 * 問題描述:二叉樹演算法驗證      
 * 輸入描述:標準函式輸入          
 * 程式輸出:標準函式輸出      
*/           

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"

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