博客
关于我
数据结构 &二叉树(三)
阅读量: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/

你可能感兴趣的文章
Mysql 语句操作索引SQL语句
查看>>
MySQL 误操作后数据恢复(update,delete忘加where条件)
查看>>
MySQL 调优/优化的 101 个建议!
查看>>
mysql 转义字符用法_MySql 转义字符的使用说明
查看>>
mysql 输入密码秒退
查看>>
mysql 递归查找父节点_MySQL递归查询树状表的子节点、父节点具体实现
查看>>
mysql 通过查看mysql 配置参数、状态来优化你的mysql
查看>>
mysql 里对root及普通用户赋权及更改密码的一些命令
查看>>
Mysql 重置自增列的开始序号
查看>>
mysql 锁机制 mvcc_Mysql性能优化-事务、锁和MVCC
查看>>
MySQL 错误
查看>>
mysql 随机数 rand使用
查看>>
MySQL 面试题汇总
查看>>
MySQL 面试,必须掌握的 8 大核心点
查看>>
MySQL 高可用性之keepalived+mysql双主
查看>>
mysql 默认事务隔离级别下锁分析
查看>>
Mysql--逻辑架构
查看>>
MySql-2019-4-21-复习
查看>>
mysql-5.7.18安装
查看>>
MySQL-Buffer的应用
查看>>