王道数据结构习题代码5.4.5(树和森林)

第四题(左孩子右兄弟表示树,求树的叶结点个数)

#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>

#define MaxSize 50

typedef char  Elemtype;

typedef struct node{ //左孩子右兄弟
   Elemtype data;
   struct node *fch,*nsib;
}*Tree;


Tree  CreateTree()
{
     Elemtype data;
     Tree T;
     scanf("%d",&data);
     if(data==-1)return NULL;
     else{
        T=(Tree)malloc(sizeof(Tree));
        T->data=data;
        printf("请输入%d的右兄弟: \n",data);
        T->nsib=CreateTree();
        printf("请输入%d的左孩子: \n",data);
        T->fch=CreateTree();
        return T;
     }
}

//左孩子右兄弟,获取叶子结点
int Leaves(Tree t)
{
    if(t==NULL)return 0;
    if(t->fch==NULL) return 1+Leaves(t->nsib);//当前结点为叶子结点
    else return Leaves(t->fch)+Leaves(t->nsib);//不为叶子节点
}




int main()
{
    printf("请输入根节点信息\n");
    Tree T=CreateTree();
    // 1 -1 2 3 4 -1 -1 -1 5 6 -1 -1 -1
    //      1
    //   2  3   4
    // 5   6
    printf("当前树的叶子结点个数为: %d\n",Leaves(T));//4 







    return 0;
}

第五题(左孩子右兄弟表示法,求树高)

#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>

#define MaxSize 50

typedef char  Elemtype;

typedef struct node{ //左孩子右兄弟
   Elemtype data;
   struct node *fch,*nsib;
}*Tree;


Tree  CreateTree()
{
     Elemtype data;
     Tree T;
     scanf("%d",&data);
     if(data==-1)return NULL;
     else{
        T=(Tree)malloc(sizeof(Tree));
        T->data=data;
        printf("请输入%d的右兄弟: \n",data);
        T->nsib=CreateTree();
        printf("请输入%d的左孩子: \n",data);
        T->fch=CreateTree();
        return T;
     }
}


int Height(Tree T)
{
    if(T==NULL)return 0;
    else{
        int hc,hs;
        hc=Height(T->fch);
        hs=Height(T->nsib);

        if(hc+1>hs)return hc+1;
        else return hs;
    }
}


int main()
{
    printf("请输入根节点信息\n");
    Tree T=CreateTree();
    // 1 -1 2 3 4 -1 -1 -1 5 6 -1 -1 -1
    //      1
    //   2  3   4
    // 5   6
    printf("根节点的高度为: %d\n",Height(T));//4







    return 0;
}

第六题(利用层次遍历数组和度的数组构造左孩子右兄弟树)

void  createCSTree_Degree(CSTree&T,Elemtype e[],int degree[],int n)
{
    CSNode *pointer=malloc(sizeof(CSNode*n));
    int i,j,d,k=0;
    for(i=0;i<n;i++)
    {
        pointer[i]->data=e[i];
        pointer[i]->lchild=pointer[i]->rsibling=NULL;
    }
    for(i=0;i<=n;i++)
    {
        d=degree[i];
        if(d)
        {
            k++;
            pointer[i]->lchild=pointer[k];
            for(j=2;j<=d;j++){
                k++;
                pointer[k-1]->rsibling=pointer[k];
            }
        }
    }
    T=pointer[0];
    delete []pointer;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值