在二叉搜索树程序 Codeblock 正在打印奇怪的字符

Posted

技术标签:

【中文标题】在二叉搜索树程序 Codeblock 正在打印奇怪的字符【英文标题】:In Binary search tree program Codeblock is printing weird characters 【发布时间】:2021-08-06 06:06:15 【问题描述】:

我正在制作可以采用后缀表达式的程序,然后将创建该表达式的二进制表达式树。我的程序运行完美。我正在通过复制/粘贴一些示例后缀表达式来测试我的程序,但问题是现在它是不按顺序打印,后订购和预购,但实际上它正在打印一个奇怪的字符。在测试时我可能不小心按下了功能键。我不确定是什么导致了这个问题。请帮我找出我的错误。

这是输出。请告诉我为什么它在 a 而不是表达式之后打印这个字符。

【问题讨论】:

推荐阅读:***.com/questions/25385173/… (struct BTstack*)malloc(sizeof(struct BTstack)) -- 为什么在 C++ 程序中使用 malloc?您正在调用delete,并使用malloc 分配内存。那是未定义的行为。另外,你为什么在不需要的地方到处使用关键字struct?看起来您正在尝试编写 C 代码,而不是 C++。 -PaulMcKenzie 我正在学习数据结构,教授指示将其仅用于学习目的……这不是现在的问题。我已经跟踪了整个程序,它甚至可以正常工作,但是现在我不知道是什么导致了这个问题。要么是代码块的编译器错误,要么是我的错误。请帮助我。我将永远感激你。 @AreebaJunaid “要么是代码块的编译器错误......” 这是极不可能的。按照我的建议做,使用调试器来遍历你的代码,并调查发生了什么,最后找出你的错误。您可以看到变量在每一步中的变化情况。 @AreebaJunaid “这不是现在的问题” 这是一个非常大的问题!它基本上使您的程序具有未定义的行为,并且您不再相信它会做任何合理的事情。 【参考方案1】:

您不初始化您分配的BTnodes 的leftChildrightChild 成员。这些指针包含随机垃圾;他们一般不是NULL

当您遍历树时,您最终会下降到叶节点,然后尝试进一步向下遍历这些垃圾指针。于是程序表现出未定义的行为。

【讨论】:

@Ignor Tandetnik 你能详细说明我在哪里犯了错误......?.....我终于到了那里。 temp = (struct BTnode*)malloc(sizeof(struct BTnode)); temp->letter=postfix[a]; 这会初始化新节点的letter 成员,但是是leftChildrightChild 成员。这些从未初始化。 @Ignore Tandetnik 我在 isalpha if 条件下初始化了它们。ln这个程序当我得到字母或数字时我创建了一个节点并初始化它们并将节点的地址存储在链接列表堆栈中......那就是为什么当我得到 operator .l 从堆栈中弹出两个元素并将节点的弹出地址存储在左右孩子中时.....请告诉我为什么我需要再次初始化? @lgor Tandetnik l 还在 main 中打印了 BTnode_top ->letter,打印效果很好 您为表示运算符的节点设置子指针,但不为表示字母或数字的节点设置子指针。您将这些指针与NULL(在if (curr==NULL))进行比较,但实际上您从未将它们设置NULL。请注意,您在程序中的任何位置都没有 leftChild = NULL;,但您希望 inorder(curr->leftChild) 看到 NULL 指针并终止递归。

以上是关于在二叉搜索树程序 Codeblock 正在打印奇怪的字符的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的代码不能在二叉搜索树中正确执行预排序?

用指针打印二叉搜索树 C++ 的奇怪方法

c++ 在二叉搜索树中删除

在二叉搜索树中查找高度

在二叉树中插入元素

在二叉搜索树中找到一个节点的父节点