C语言数据结构-树和二叉树-树转二叉树-使用队列,编写transfrom函数,将普通树转换成对应的二叉树

news/2024/7/5 21:15:48

树转二叉树

使用队列,编写transfrom函数,将普通树转换成对应的二叉树。二叉树的相关定义如下:

typedef int DataType;

typedef struct Node{
    DataType data;
    struct Node* left;
    struct Node* right;
}BiTNode, *BiTree;

普通树节点的定义如下:

#define MAX_CHILDREN_NUM 5
struct _CSNode
{
    DataType data;
    struct _CSNode *children[MAX_CHILDREN_NUM];
};
typedef struct _CSNode CSNode;

其中,子树的根节点的指针存放在children数组的前k个元素中,即如果children[i]的值为NULL,而children[i-1]不为NULL,则表明该结点只有i棵子树,子树根结点分别保存在children[0]至children[i-1]中。

队列相关定义及操作如下:

struct __Queue
{
    int i, j; //指向数组内元素的游标
    void **array;
};
typedef struct __Queue Queue;

Queue* create_queue(); //创建队列
bool is_empty_queue(Queue *tree); //队为空返回true,不为空时返回false
void* del_queue(Queue *tree); //结点指针出队
void add_queue(Queue *tree, void *node); //结点指针入队
void free_queue(Queue *tree); //释放队列

transform函数定义如下:

BiTNode* transform(CSNode *root);

其中 root 为普通树的根结点,函数返回该树对应二叉树的根结点。

提供代码

#include <stdlib.h>
#include <stdio.h>
#include "bitree.h" //请不要删除,否则检查不通过


BiTNode* transform(CSNode *root){


}

解析思路

参考代码

BiTNode* transform(CSNode* root)
{
    if (root == NULL)
        return NULL;
        
    //初始化二叉树的根节点
    BiTree broot = (BiTree)malloc(sizeof(struct Node));
    broot->data = root->data;
    broot->left = broot->right = NULL;
    
    //普通树、二叉树初始化、加入队列
    Queue* queue = create_queue();
    Queue* bqueue = create_queue();
    add_queue(queue, root);
    add_queue(bqueue, broot);
    
    while (!is_empty_queue(queue))
	{
        //从普通数和二叉树中分别取出一个结点
        CSNode* node = del_queue(queue);
        BiTree bTreeNode = del_queue(bqueue);
        
        int i;
        BiTree former = NULL;
        //遍历普通树结点的所有孩子结点,将孩子加入队列
        for (i = 0; i < MAX_CHILDREN_NUM; i++) 
		{
			//孩子非空
            if (node->children[i]) 
			{
				//二叉树节点初始化并赋值
                BiTree bnode = (BiTree)malloc(sizeof(struct Node));
                bnode->left = bnode->right = NULL;
                bnode->data = node->children[i]->data;
				
                if (i == 0)//普通树的第一个孩子作为二叉树的左孩子
                    bTreeNode->left = bnode;
                 else //后面的孩子结点作为前面结点的右孩子
                    former->right = bnode;
                former = bnode;
                
                add_queue(queue, node->children[i]);
                add_queue(bqueue, bnode);
            }
        }
    }
    free(queue->array);
    free(queue);
    free(bqueue->array);
    free(bqueue);
    return broot;
}

解析:数组树

解析:二叉链表的树和二叉树没区别


http://www.niftyadmin.cn/n/610552.html

相关文章

【JokerのZYNQ7020】FLASH_TEST。

软件环境&#xff1a;vivado 2017.4 硬件平台&#xff1a;XC7Z020 在实际项目中&#xff0c;写好的ZYNQ工程在debug测试完毕之后&#xff0c;固化到FLASH往往是最后一步&#xff0c;然而&#xff0c;在固化的过程中&#xff0c;往往并不都是一次就能成功的&#xff0c;而固化不…

java程序员面试题目看你能回答几个(付答案)

第一&#xff0c;谈谈final&#xff0c; finally&#xff0c; finalize的区别。 ??第二&#xff0c;Anonymous Inner Class &#xff08;匿名内部类&#xff09; 是否可以extends&#xff08;继承&#xff09;其它类&#xff0c;是否可以implements&#xff08;实现&#xff…

【JokerのZYNQ7020】ZED_AD9361。

软件环境&#xff1a;vivado 2019.1 硬件平台&#xff1a;XC7Z020 作为AD/DA标杆&#xff0c;感觉只要参与过一些AD/DA项目&#xff0c;基本避不开用ADI的片子。ADI的手册和资料做的也是&#xff0c;那叫一地道。所以今天就来说一说&#xff0c;如何针对某一款ADI的片子&#x…

【JokerのNote】Ethernet_Interface。

将常用的网络接口总结一下&#xff0c;主要分为MAC与PHY之间的和PHY之前的&#xff0c;我们在说接口时&#xff0c;一定要注意接口所处的位置&#xff0c;MAC与PHY之间的接口大体上常用的有MII/GMII/RGMII/SGMII&#xff0c;PHY之前的常见接口主要分为1000BASE-T/1000BASE-X/10…

【JokerのZYNQ7020】DDS_Compiler。

软件环境&#xff1a;vivado 2019.1 硬件平台&#xff1a;XC7Z020 对于自产生的正余弦数据源最常用的一般有两种办法&#xff0c;一种是通过matlab生成coe存到ram里&#xff0c;使用的时候播出来&#xff0c;另一种就是通过自带的DDS核来产生&#xff0c;今天就来说说DDS_Compi…

【JokerのNote】Ethernet_Frame。

就是之前不是总结了下网络接口吗&#xff0c;这次继续顺着总结下网络帧格式。这里主要参考的是《计算机网络》这本书&#xff0c;书写的非常非常的好&#xff0c;感兴趣的朋友可以细翻一下&#xff0c;我这里只是当笔记做个总结。 在介绍具体以太网帧格式之前&#xff0c;先对…

【JokerのNote】常用字符集与编码方式。

在介绍ASCII、GB2312、UNICODE、UTF-8、UTF-16等等之前&#xff0c;我觉得还是有必要先说下题目&#xff0c;什么是字符集&#xff0c;什么是编码方式。鄙人愚见&#xff0c;字符集就是字符的集合&#xff0c;如ASCII、GB2312、UNICODE等等&#xff0c;而编码方式指的是码值与字…

【JokerのKCU105】SGMII。

软件环境&#xff1a;vivado 2019.1 硬件平台&#xff1a;KCU105 我之前一直以为&#xff0c;SGMII只能走GT BANK使用SFP口&#xff0c;直到很偶然的情况下&#xff0c;我发现了居然在普通的BANK走LVDS也行&#xff0c;不信邪的我一直想要试一试&#xff0c;恰巧我的一个好哥们…