ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

(转)二叉树的建立 C语言描述

2022-05-14 10:34:04  阅读:130  来源: 互联网

标签:结点 nRow tree BinaryTree C语言 二叉树 line data 描述


这篇blog转自笔者的CSDN账号,为笔者学习《数据结构》课程时所撰写,现转至博客园,仅作归档用。
原文的撰写时间是2021-05-14。

学校的《数据结构》教材给出的二叉树的建立算法有点问题,因此自己稍加修改以使之可以使用。

结点定义

typedef int element_type;
typedef struct binary_tree {
    element_type data;
    struct binary_tree *lchild;    //左孩子
    struct binary_tree *rchild;    //右孩子
} BinaryTree;

树的结点数据可以从键盘读入,也可以从文件读入。这里采用从文件读入结点数据的方式,读入的算法不再详述。数据格式为:

[结点数据内容] [是否有左孩子] [是否有右孩子]

比如,一个结点的数据为100,有左孩子,没有右孩子,则可表示为:

100 1 0

文件一行记录一个结点,按照先序遍历的顺序存储行。读取的结果存放在data_line[100][3]中,data_line[x][0]存储数据,data_line[x][1][x][2]存储左孩子和右孩子的情况。

具体实现如下,用了两个函数。要创建树,调用createBinaryTree()即可。

BinaryTree *createTree(BinaryTree *tree, int data_line[100][3], int *arr_len, int *nRow)
{
    tree->data = data_line[*nRow][0];   //赋值
    tree->lchild = NULL;
    tree->rchild = NULL;

    int nRowCurr = *nRow;               //存储当前行数
    if (data_line[nRowCurr][1] == 1) {
        (*nRow)++;
        tree->lchild = (BinaryTree *)malloc(sizeof(BinaryTree));    //为左孩子分配空间
        createTree(tree->lchild, data_line, arr_len, nRow);
    }
    if (data_line[nRowCurr][2] == 1) {
        (*nRow)++;
        tree->rchild = (BinaryTree *)malloc(sizeof(BinaryTree));    //为右孩子分配空间
        createTree(tree->rchild, data_line, arr_len, nRow);
    }

    if (*nRow + 1 == *arr_len)      //递归的结束条件,结束后返回当前调用栈的tree,即根节点。
        return tree;
    return NULL;            //递归未结束时,返回值没有用,这里随便返回一个NULL
}

int createBinaryTree(BinaryTree **tree)
{
    int arr_len;
    int data_line[100][3];
    int nRow = 0;
    readFile("/mnt/d/WorkSpace/DataStructure/Homework/homework06/data.txt", &arr_len, data_line);
    *tree = (BinaryTree *)malloc(sizeof(BinaryTree));       //先为根节点分配空间
    *tree = createTree(*tree, data_line, &arr_len, &nRow);  //创建根节点的子树

    return arr_len;     //返回这棵树的结点数量
}

readFile() 那一行是从文件读入数据,这里不再给出。

在父结点的调用栈为孩子结点分配空间的原因是为了防止孩子结点的地址丢失。如果每个调用栈只为自身结点分配空间的话,本来孩子结点是NULL,进入孩子结点的调用栈再分配存储空间,则孩子结点的地址要发生变化(从NULL变成一个确定的分配值),而父节点是无法得知这个变化的,这样就会导致地址丢失。

Happy Hacking!

参考文献

[1].胡学刚,张先宜.数据结构[M].安徽大学出版社:合肥,2015:134.

标签:结点,nRow,tree,BinaryTree,C语言,二叉树,line,data,描述
来源: https://www.cnblogs.com/eslzzyl/p/16269252.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有