博客
关于我
数据结构 &二叉树(三)
阅读量:782 次
发布时间:2019-03-25

本文共 2069 字,大约阅读时间需要 6 分钟。

二叉树的创建与递归调用的分析与修正

为了更好地分析二叉树的创建过程,我们从代码入手理解其结构及其递归调用的特点。通过构建两种不同的二叉树,一种是通过键盘输入字符构建,另一种是通过字符串处理构建,我们得以深入研究递归调用的内在原理及其潜在问题。

二叉树的结构定义

typedef struct BtNode {    struct BtNode* leftchild;  // 左孩子节点    struct BtNode* parent;    // 双亲指针    struct BtNode* rightchild; // 右孩子节点    ElemType data;          // 数据域} BtNode, *BinaryTree;BinaryTree Buynode() {    struct BtNode* s = (struct BtNode*)malloc(sizeof(struct BtNode));    if (NULL == s) {        exit(0);    }    memset(s, 0, sizeof(struct BtNode));    return s;}

键盘输入创造二叉树的实现

BinaryTree CreateTree() {    ElemType ch;    BinaryTree s = NULL;    cin >> ch;    if (ch != END) {        s = Buynode();        s->data = ch;        s->leftchild = CreateTree();        s->rightchild = CreateTree();    }    return s;}int main() {    BinaryTree root = NULL;    root = CreateTree();    InOrder(root);    return 0;}

通过键盘输入创建的二叉树呈现出明显的层次结构,中序遍历结果为"CBEDFAGH",体现出二叉树的特性。

字符串创造二叉树的探索

BinaryTree strCreateTree(char* &str) {    BinaryTree s = NULL;    if (str != NULL && *str != END) {        s = Buynode();        s->data = *str;        s->leftchild = strCreateTree(&str);        s->rightchild = strCreateTree(&str);    }    return s;}int main() {    char* str = "ABC##DE##F##G#H##";    BinaryTree root = NULL;    root = strCreateTree(str);    InOrder(root);    PreOrder(root);    EndOrder(root);    return 0;}

初步观察发现,直接使用传递引用获得诸多差异,问题源于递归调用的本质。在递归调用过程中,不同的栈帧操作同一字符串会造成指针错位,导致树构造异常。正确的做法是将字符串作为引用传递,使所有递归调用对同一字符串进行操作,确保数据的一致性和完整性。

递归调参与字符串操作的修正

BinaryTree strCreateTree(char* &str) {    BinaryTree s = NULL;    if (str != NULL && *str != END) {        s = Buynode();        s->data = *str;        s->leftchild = strCreateTree(&str);        s->rightchild = strCreateTree(&str);    }    return s;}

修正后的代码中,通过传递引用实现了对同一字符串在多个递归调用中的正确处理。可以看到,每个递归调用都对字符串起点进行操作,确保字符的处理顺序与预期一致,避免了前置操作带来的错误。

此次修正不仅解决了构建二叉树 gio的问题,更为我们理解递归调用的本质提供了宝贵的机会。深入分析发现,递归调用的过程涉及多个栈帧,每个栈帧都有自己的数据状态,在操作同一字符串时,关键是如何协调这些互相独立的操作。通过将原始数据以引用形式传递,可以实现多个递归调用的数据一致性,确保操作的正确性和完整性。

二叉树的构造固然是数据结构与算法的基础,其背后反映出的编程范式和思维方式则对开发者具有重要的训练价值。尤其是在处理递归算法时,理解其工作机制能够帮助我们更好地避免常见错误,提升代码质量和开发效率。

转载地址:http://jmtuk.baihongyu.com/

你可能感兴趣的文章
SpringBoot 整合 Mybatis Plus 实现基本CRUD功能
查看>>
pandas的to_sql方法中使用if_exists=‘replace‘
查看>>
Springboot ppt转pdf——aspose方式
查看>>
pandas读取csv编码utf-8报错
查看>>
pandas读取parquet报错
查看>>
pandas读取数据用来深度学习
查看>>
pandas读取文件时,不去掉前面的0 保留原有的数据格式
查看>>
Pandas进阶大神!从0到100你只差这篇文章!
查看>>
spring5-介绍Spring框架
查看>>
pandas,python - 如何在时间序列中选择特定时间
查看>>
Spring 框架之 AOP 原理深度剖析
查看>>
Pandas:如何按列元素的组合分组,以指示基于不同列的值的同现?
查看>>
Pandas:将一列与数据帧的所有其他列进行比较
查看>>
PANDA和GLOB:将文件夹中的所有xlsx文件转换为CSV类型错误:__init__()获得意外的关键字参数‘;xfid‘;
查看>>
panda查找想要找的行合并成一个新pd
查看>>
PANDA:基于多列对数据表的行运行计算,并将输出存储在新列中
查看>>
PandoraFMS 监控软件 SQL注入漏洞复现
查看>>
PandoraFMS 监控软件 任意文件上传漏洞复现
查看>>
PanTools多网盘登录神器
查看>>
Papyrus项目常见问题解决方案
查看>>