1. 程式人生 > >第十週 專案2- 二叉樹構造演算法的驗證

第十週 專案2- 二叉樹構造演算法的驗證

Copyright (c) 2017,煙臺大學計算機與控制工程學院                           
*All rights reserved.                                     
*作    者:武美妤                          
*完成日期:2017年11月2日                           
*版 本 號:v1.0                           
*問題描述:二叉樹構造演算法的驗證
main.cpp

#include <stdio.h>
#include "order.h"
#include <malloc.h>
int main()
{
     ElemType pre[]="ABDGCEF",in[]="DGBAECF";
    BTNode *b1;
    b1=CreateBT1(pre,in,7);
    printf("b1:");
    DispBTNode(b1);
    printf("\n");
    return 0;
}

order.cpp

#include <stdio.h>
#include "order.h"
#include <malloc.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;
}
void CreateBTNode(BTNode *&b,char *str)     //由str串建立二叉鏈
{
    BTNode *St[MaxSize],*p=NULL;
    int top=-1,k,j=0;
    char ch;
    b=NULL;             //建立的二叉樹初始時為空
    ch=str[j];
    while (ch!='\0')    //str未掃描完時迴圈
    {
        switch(ch)
        {
        case '(':
            top++;
            St[top]=p;
            k=1;
            break;      //為左節點
        case ')':
            top--;
            break;
        case ',':
            k=2;
            break;                          //為右節點
        default:
            p=(BTNode *)malloc(sizeof(BTNode));
            p->data=ch;
            p->lchild=p->rchild=NULL;
            if (b==NULL)                    //p指向二叉樹的根節點
                b=p;
            else                            //已建立二叉樹根節點
            {
                switch(k)
                {
                case 1:
                    St[top]->lchild=p;
                    break;
                case 2:
                    St[top]->rchild=p;
                    break;
                }
            }
        }
        j++;
        ch=str[j];
    }
}
BTNode *FindNode(BTNode *b,ElemType x)  //返回data域為x的節點指標
{
    BTNode *p;
    if (b==NULL)
        return NULL;
    else if (b->data==x)
        return b;
    else
    {
        p=FindNode(b->lchild,x);
        if (p!=NULL)
            return p;
        else
            return FindNode(b->rchild,x);
    }
}
BTNode *LchildNode(BTNode *p)   //返回*p節點的左孩子節點指標
{
    return p->lchild;
}
BTNode *RchildNode(BTNode *p)   //返回*p節點的右孩子節點指標
{
    return p->rchild;
}
void DispBTNode(BTNode *b)  //以括號表示法輸出二叉樹
{
    if (b!=NULL)
    {
        printf("%c",b->data);
        if (b->lchild!=NULL || b->rchild!=NULL)
        {
            printf("(");
            DispBTNode(b->lchild);
            if (b->rchild!=NULL) printf(",");
            DispBTNode(b->rchild);
            printf(")");
        }
    }
}
void DestroyBTNode(BTNode *&b)   //銷燬二叉樹
{
    if (b!=NULL)
    {
        DestroyBTNode(b->lchild);
        DestroyBTNode(b->rchild);
        free(b);
    }
}


order.h

#ifndef ORDER_H_INCLUDED
#define ORDER_H_INCLUDED
#define MaxSize 100
typedef char ElemType;
typedef struct node
{
    ElemType data;
    struct node * lchild;
    struct node * rchild;
}BTNode;
void CreateBTNode(BTNode *&b,char *str);        //由str串建立二叉鏈
BTNode *FindNode(BTNode *b,ElemType x);     //返回data域為x的節點指標
BTNode *LchildNode(BTNode *p);      //返回*p節點的左孩子節點指標
BTNode *RchildNode(BTNode *p);      //返回*p節點的右孩子節點指標
BTNode *CreateBT1(char *pre,char *in,int n);
void DispBTNode(BTNode *b);     //以括號表示法輸出二叉樹
void DestroyBTNode(BTNode *&b);     //銷燬二叉樹
#endif // ORDER_H_INCLUDED

知識點總結:任何n個不同結點的二叉樹,都可以由他的中序序列和先序序列唯一確定。

學習心得:二叉樹可以由中序序列和先序序列唯一確定,也可以由中序序列和後序序列唯一確定。

學習