二叉树及其应用--树

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/z861269429/article/details/51778635

给定树的孩子兄弟表示的数据类型如下

typedef char ElemType;
struct CSNode;
typedef struct CSNode * CSTree;
typedef struct CSNode CSTNode;
struct CSNode
{
    ElemType data;
    struct CSNode *child; //第一个孩子
    struct CSNode *sibling; //下一个兄弟

树的创建I
完成CSTree CreateTree(char s[])函数,该函数由字符串s创建一颗树,其中字符串s是仅由‘(’、‘)’、‘,’以及大小写字符构成的树的广义表表示,如A(B(D,E,F),C(G)),字符串s以’\0’结尾。创建树时,下一兄弟链安装结点出现的顺序链接,如A(B(D,E,F),C(G))创建的树如下所示

CSTree NewNode(ElemType x)
{
    CSTree p=(CSTree)malloc(sizeof(CSNode));
    p‐>data=x;
    p‐>child=NULL;
    p‐>sibling=NULL;
    return p;
}
CSTree CreateTree(char s[])
{
    int i,k,top;
    CSTree path[N],p,t;
    k=0;
    top=‐1;
    for(i=0;s[i]!='\0';i++)
    {
        switch(s[i])
        { 
        case '(':
            path[++top]=p;
            k=1;
            break;
        case ',':
            k=2;
            break;
        case ')':
            top‐‐;
            break;
        } 
        if(isalpha(s[i]))
        {
            p=NewNode(s[i]);
            if(k==1)
                path[top]‐>child=p;
            else if(k==2)
            {
                t=path[top]‐>child;
                while(t‐>sibling!=NULL)
                    t=t‐>sibling;
                t‐>sibling=p;
            }
        }
    } 
    return path[0];
}//2333

树的创建II
完成CSTree CreateTree(char s[])函数,该函数从标准输入创建一颗树。
创建树时,下一兄弟链安装结点出现的顺序链接,如输入样例创建的树如下所示

输入样列:

输入有多多行,表示树的广度优先遍历。输入样例表示如下所示的一颗树

A
BC#
DEF#
G#
#
#
#
#

CSTree NewNode(ElemType x)
{
    CSTree p=(CSTree)malloc(sizeof(CSNode));
    p‐>data=x;
    p‐>child=NULL;
    p‐>sibling=NULL;
    return p;
}
CSTree CreateTree()
{
    char a,s[N];
    scanf("%c",&a);
    getchar();
    CSTree root=NewNode(a);
    CSTree u,p,t;
    queue<CSTree>q;
    q.push(root);
    while(!q.empty())
    {
        u=q.front();
        q.pop();
        fgets(s,N,stdin);
        if(s[0]=='#')
            continue;
        p=NewNode(s[0]);
        u‐>child=p;
        q.push(p);
        for(int i=1;s[i]!='#';i++)
        {
            p=NewNode(s[i]);
            q.push(p);
            t=u‐>child;
            while(t‐>sibling!=NULL)
                t=t‐>sibling;
            t‐>sibling=p;
        }
    }
    return root;
}

完成void Pre_Order(CSTree root)函数,该函按前序遍历的方式遍历树上的结点(下一兄弟中按顺序),如下图所示,前序遍历为ABDEFCG

void Pre_Order(CSTree root)
{
    if(root!=NULL)
    {
        printf("%c",root‐>data);
        if(root‐>child!=NULL)
            Pre_Order(root‐>child);
        if(root‐>sibling!=NULL)
            Pre_Order(root‐>sibling);
    }
}//2335

完成void Post_Order(CSTree root)函数,该函按前后遍历的方式遍历树上的结点(下一兄弟中按顺序),如下图所示,后序遍历为DEFBGCA

void Post_Order(CSTree root)
{
    if(root!=NULL)
    {
        if(root‐>child!=NULL)
            Post_Order(root‐>child);
        printf("%c",root‐>data);
        if(root‐>sibling!=NULL)
            Post_Order(root‐>sibling);
    }
}//2336

猜你喜欢

转载自blog.csdn.net/z861269429/article/details/51778635