普通树(双亲表示法存储)转二叉树【左孩子右兄弟表示法】

本文对普通树采用顺序存储结构

 图片来源:https://blog.csdn.net/weixin_44162361/article/details/118994573?ops_request_misc=&request_id=&biz_id=102&utm_term=%E6%A0%91%20%E8%96%9B%E5%AE%9A%E8%B0%94%E7%9A%84%E7%8C%AB&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-118994573.142^v42^pc_rank_34,185^v2^control&spm=1018.2226.3001.4449icon-default.png?t=M7J4https://blog.csdn.net/weixin_44162361/article/details/118994573?ops_request_misc=&request_id=&biz_id=102&utm_term=%E6%A0%91%20%E8%96%9B%E5%AE%9A%E8%B0%94%E7%9A%84%E7%8C%AB&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-118994573.142^v42^pc_rank_34,185^v2^control&spm=1018.2226.3001.4449

输入格式:

 

 图片来源:

https://blog.csdn.net/weixin_44162361/article/details/118994573?ops_request_misc=&request_id=&biz_id=102&utm_term=%E6%A0%91%20%E8%96%9B%E5%AE%9A%E8%B0%94%E7%9A%84%E7%8C%AB&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-118994573.142^v42^pc_rank_34,185^v2^control&spm=1018.2226.3001.4449icon-default.png?t=M7J4https://blog.csdn.net/weixin_44162361/article/details/118994573?ops_request_misc=&request_id=&biz_id=102&utm_term=%E6%A0%91%20%E8%96%9B%E5%AE%9A%E8%B0%94%E7%9A%84%E7%8C%AB&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-118994573.142^v42^pc_rank_34,185^v2^control&spm=1018.2226.3001.4449

以下为普通树转二叉树完整代码:

#include<stdio.h>
#include<malloc.h>

#define MaxSize 50

typedef struct TreeNode
{
    char data;
    struct TreeNode* left_firstchild;
    struct TreeNode* nextsibiling;
}TreeNode,*BinTreeNode;


typedef struct
{
    char data;
    int parent;
}NorTreeNode;

BinTreeNode ConstructTree(NorTreeNode* p,int num)
{
    BinTreeNode Root,cur_node;
    Root = NULL;    // 根节点
    TreeNode* brr[num];     // 指针数组,存放节点
    for(int j=0;j<num;j++)
    {
        cur_node = (BinTreeNode)malloc(sizeof(TreeNode));   // 申请新节点
        cur_node->data = p[j].data;     // 复制data
        cur_node->left_firstchild = cur_node->nextsibiling = NULL;
        brr[j] = cur_node;      // 将节点指针存入数组
        if(Root == NULL) { Root = cur_node; }
    }
    for(int i=0;i<num-1;i++)
    {
        //  寻找第一个孩子节点
        for(int k=i+1;k<num;k++)
        {
            if(i == p[k].parent)
            {
                brr[i]->left_firstchild = brr[k];   // 父节点连接孩子节点
                break;
            }
        }
        //   寻找第一个兄弟节点
        for(int k=i+1;k<num;k++)
        {
            if(p[i].parent == p[k].parent)
            {
                brr[i]->nextsibiling = brr[k];  // 连接兄弟节点
                break;
            }
        }

    }


    return Root;
}

void PreorderVisit(BinTreeNode RooT)
{
    if(RooT != NULL)
    {
        printf("%c",RooT->data);
        PreorderVisit(RooT->left_firstchild);
        PreorderVisit(RooT->nextsibiling);
    }

}
int main()
{
    NorTreeNode arr[MaxSize];
    BinTreeNode root;
    int n;
    printf("Number of nodes: \n");
    scanf("%d",&n);
    getchar();  // 接收回车键
    for(int i=0;i<n;i++)
    {
        scanf("%c %d",&arr[i].data,&arr[i].parent);
        getchar();
    }
    root = ConstructTree(arr, n);
    PreorderVisit(root);

    return 0;
}

 该代码在Code::Blocks 20.03中测试通过

如有错误,恳请各位批评指正!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

带带萌新JAMMY BEAR

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值