栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

自动创建满二叉树

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

自动创建满二叉树

本文记录如何使用程序自动创建一个满二叉树(主要记录如何创建满二叉树的过程)

运行截图:(结果为先序排列) 

程序如下:

#define _CRT_SECURE_NO_WARNINGS 1
//假定输入的数据为完全二叉树的格式
#include 
#include 
#include 
#define MAXLEN 15//二叉树中元素的个数
typedef char DATA;//定义元素类型
int flag;//标识为,记录编码后结点的数值
typedef struct CBTTYPE
{
    DATA data;
    struct CBTTYPE *left;
    struct CBTTYPE *right;
}CBTTYPE;//二叉树结构体
static int num;
CBTTYPE *InitTree()//初始化二叉树,输入首结点
{
    CBTTYPE *node;
    if (node = (CBTTYPE *)malloc(sizeof(CBTTYPE)))
    {
        printf("请输入根结点数据:n");
        scanf("%s", &node->data);
        node->left = NULL;
        node->right = NULL;
        if (node != NULL)
        {
            return node;
        }
        else
        {
            return NULL;
        }
    }
    return NULL;
}
int power(int x, int y)//平方减1
{
    int i = 0;
    int result = 1;
    if (y == 0)return 0;
    for (; i < y; i++)
    {
        result = x *result;
    }
    return result - 1;
}
int log_x(int data)//求二的几次方,弄复杂了,可以直接除2算上一层的节点数
{
    for (int i = 1; i < 10; i++)
    {
        if (data < power(2, i) + 1)
        {
            return i;
        }
    }
    return 0;
}
void addNode(CBTTYPE* treenode,DATA* data)//满二叉树自动增加结点,每层从右向左
{
    //尝试使用编码方式
    //power(2,log_x(sizeof(data)))
    int ok = power(2, log_x(MAXLEN) -1 ) + 1;
    if (flag  < ok)
    {
        treenode->left = (CBTTYPE *)malloc(sizeof(CBTTYPE));
        flag = 2 * flag + 1;
        treenode->left->data = data[flag - 1];
        addNode(treenode->left, data);
        
        treenode->right = (CBTTYPE *)malloc(sizeof(CBTTYPE));
        flag = 2*flag;
        treenode->right->data = data[flag - 1];
        addNode(treenode->right, data);
    }
    else
    {
        treenode->left = NULL;
        treenode->right = NULL;
    }
    flag = flag /2;
}
void PreambleSort(CBTTYPE *treenode)//先序排序
{
    if (treenode->left != NULL && treenode->left->data != '#')
    {
        PreambleSort(treenode->left);
    }
    printf("%c", treenode->data);
    if (treenode->right != NULL && treenode->left->data  != '#')
    {
        PreambleSort(treenode->right);
    }
    
}
int main()
{
    flag = 1;//初始化为1
    CBTTYPE *root = NULL;
    root = InitTree();
    DATA* data = (DATA *)malloc(sizeof(DATA) * MAXLEN);//假设数据为ABCD#F#F####G
    scanf("%s", data);
    addNode(root, data);
    //printf("root的大小%d", power(2,4));
    PreambleSort(root);
}

记录一下关键点:

如上图所示,输入二叉树格式为ABCDEFG

我借助哈夫曼编码向右为0,像左为1,这样叶子层的大小就会超过上一层的大小,从而作为无下一层的依据。

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/913497.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号