【问题标题】:Create recursive binary tree?创建递归二叉树?
【发布时间】:2011-05-08 13:04:40
【问题描述】:

我有两个堆栈,一个带有操作数,另一个带有运算符。我的问题是将这两个堆栈变成二叉树。

例如,表达式(2+3)*(4-3) 将被翻译成后缀(如24+43-*)然后放入两个堆栈 3442*-+ 将是堆栈(顶部分别为 3 和 *)。

现在有了这些堆栈,我需要像这样形成一个二叉树

   *
 +    -
2 3  4 3

有没有办法递归地做到这一点?

现在,我有一个这样的算法:

  • 创建树的根,将根的值分配给运算符堆栈中的第一个运算符。将左右指针设置为空。

  • 创建正确的节点,如果存在则分配下一个运算符的值,如果不存在则分配一个操作数。然后对左边的节点做同样的事情。

我的问题是让它递归,或者让它处理许多不同的情况。

感谢您的帮助。

【问题讨论】:

  • 你稍微弄乱了数字堆栈。下面 Let_Me_Be 的回答看起来不错,您需要更多详细信息吗?
  • 更多细节会很好。具体来说,我可以找到最高的运算符,但我不确定如何拆分表达式或“适用于两个部分”。
  • 您的方法似乎有缺陷:它要求运算符的每一侧都有相同数量的操作数和运算符。使用此表达式 (2+3)-4 会产生与 2+(3-4) 相同的堆栈。
  • 阿德里安,你能给点建议吗?
  • 您的描述似乎不是唯一的。例如,给定堆栈4321*-+,你能判断它应该是(1+2)*(3-4) 还是((1+2)-3)*4

标签: c recursion tree stack


【解决方案1】:

一般来说没有办法做到这一点。 “1 2 3 4”“* + /”是指“1 2 3 4 * + /”(即“1 /(2 + 3 * 4)”)还是“1 2 * 3 + 4 /”,(即“(1 * 2 + 3) / 4”)。

【讨论】:

    【解决方案2】:

    如果您的表达式始终是对称的(运算符两侧的操作数和运算符数量相同),那么您描述的方法可以正常工作,只需稍作修改:

    1. 创建一个节点,分配算子栈顶算子的值。
    2. 如果算子栈中没有算子了,则从操作数栈中弹出2个操作数分配给左右分支,然后退出
    3. 如果堆栈中有任何运算符,请转到节点的左分支并调用您的算法,然后转到右分支并调用您的算法。

    (Jan 在他的回答中解释得更清楚......)

    【讨论】:

    • 我会假设它总是对称的。我会试试你的方法。感谢您的帮助。
    【解决方案3】:

    假设你只有二元运算符

    treeNode createNode(operators, operands) {
      // take first operator and create a new treeNode with it. pop it from the operators stack 
    
      // if it is the last operator in the list then there should be only two operands left in the operands and you can assign them to the left and right child of the treeNode. return this treeNode.
    
      // if it is not the last operator then split the operands in two stacks equally
      // leftOperands and rightOperands
      // left child becomes createNode(operators, leftoperands)
      // right child becomes createNode(operators, rightoperands)
      // return this treeNode
    
    }
    

    【讨论】:

    • 我不确定如何拆分我的操作数堆栈。我想我需要以某种方式找到操作数的#?如果它是奇怪的,那有更多的操作数有关系吗?
    • 我假设您只有二元运算符,因此您将拥有两个 # 操作数的幂。我不确定我的算法是否有效。您应该将其视为我将如何处理此问题,它可能包含漏洞。成功!
    • 嗯,对了,忘记了在这种情况下不会很奇怪。谢谢,我试试看。
    • 2个操作数的幂? ((1+2)*3)呢?
    【解决方案4】:

    递归算法:

    • 找到最高优先级的运算符
    • 围绕该运算符拆分表达式
    • 递归地应用于两个部分

    【讨论】:

    • 将此方法与24+43*-(对应(2+4)-(4*3))的堆栈一起应用并查看结果...
    • 见我上面的评论,我想了解更多细节。谢谢。
    • @Adrien 我错过了后缀部分。该算法适用于中缀格式。
    • @Blackbinary 我说的是中缀格式。 x+y*z 将围绕 * 拆分为 x+yz
    猜你喜欢
    • 2020-08-20
    • 2016-04-19
    • 2014-03-29
    • 2011-07-23
    • 2019-05-03
    • 2019-07-27
    • 1970-01-01
    • 2013-10-24
    • 2010-12-07
    相关资源
    最近更新 更多