【问题标题】:Binary Tree Implemetation in C for calculating用于计算的 C 中的二叉树实现
【发布时间】:2020-02-03 11:57:11
【问题描述】:

我正在阅读一本关于数据结构的书,但我在书中遇到了二叉树的实现示例。问题是我需要在下面计算和实现这个解析树:

这是我上面提到的例子的源代码:

我了解树,但我无法理解源代码的真正含义,因为我正在阅读的书并没有解释每个步骤。我真的需要对源代码进行更深入的解释。 编辑:您可以专注于循环步骤,这是我最难理解的一步

【问题讨论】:

  • 请更具体一点:您需要解释哪一步?这本书有任何口头解释吗?
  • @bereal 它只是给了我解析树之后的源代码,所以我什么都不懂
  • for 行令人讨厌地混淆了。将stackinit()移到该行上方,并将for更改为while (scanf("%1s", &c) != EOF),这样可能会更清晰。
  • 本书章节在展示这棵树和代码之前说了些什么?显示代码后书上说了什么?也许该文本中的某处是对所使用算法的解释,并且代码显示了它的可能实现?
  • @usr2564301 更不用说用"%1s"代替" %c"了。

标签: c algorithm data-structures


【解决方案1】:

这段代码似乎实现了Reverse polish notation,即运算符跟随其操作数的符号。它读取记录在 RPN 中的表达式并构建相应的二叉树。例如,对于上面的树,RPN 表单将是:

ABC+DE**F+*

逻辑非常简单,基于包含树节点的堆栈:

  • 每次遇到操作数(即字母)时,都会创建一个带有操作数的新叶节点并将其压入堆栈。
  • 每次遇到运算符时,都会创建一个新的运算符节点,用于替换堆栈中最顶层的两个节点。被替换的节点成为新节点的子节点。

最后,你得到了栈顶的表达式树。

更新: 至于你提到的具体行:z 是一种特殊的树节点,sentinel,在图片上被描绘为一个小矩形。那是一个无值节点,它可以让您知道何时到达树底。另一种方法是使用空指针(上面的链接比较了这些方法)。

z->l = z; 
z->r = z;

使节点成为自己的子节点。一个哨兵节点也可以代表一棵空树。

现在在循环中:

x->info = c;
x->l = z;
x->r = x;

创建一个新的叶节点(操作数节点没有子节点)。如果我们随后发现该节点实际上是一个运算符,则立即将子节点替换为堆栈中的操作数。

【讨论】:

  • 你能帮我解释一下吗:1.z->l = z; z->r = z; 2.类似(1)的代码,但在循环for?实际上,我无法理解这些台词
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 2013-05-03
  • 2013-03-23
相关资源
最近更新 更多