博客
关于我
数据结构 &二叉树(三)
阅读量: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 Order By实现原理分析和Filesort优化
查看>>
mysql problems
查看>>
mysql replace first,MySQL中处理各种重复的一些方法
查看>>
MySQL replace函数替换字符串语句的用法(mysql字符串替换)
查看>>
Mysql Row_Format 参数讲解
查看>>
mysql select, from ,join ,on ,where groupby,having ,order by limit的执行顺序和书写顺序
查看>>
MySQL Server 5.5安装记录
查看>>
mysql slave 停了_slave 停止。求解决方法
查看>>
MySQL SQL 优化指南:主键、ORDER BY、GROUP BY 和 UPDATE 优化详解
查看>>
mysql sum 没返回,如果没有找到任何值,我如何在MySQL中获得SUM函数以返回'0'?
查看>>
mysql Timestamp时间隔了8小时
查看>>
Mysql tinyint(1)与tinyint(4)的区别
查看>>
mysql union orderby 无效
查看>>
mysql where中如何判断不为空
查看>>
mysql workbench6.3.5_MySQL Workbench
查看>>
MySQL Workbench安装教程以及菜单汉化
查看>>
MySQL Xtrabackup 安装、备份、恢复
查看>>
mysql [Err] 1436 - Thread stack overrun: 129464 bytes used of a 286720 byte stack, and 160000 bytes
查看>>
MySQL _ MySQL常用操作
查看>>
MySQL – 导出数据成csv
查看>>