创建递归二叉树?

时间:2010-11-11 15:20:58

标签: c recursion tree stack

我有两个堆栈,一个用操作数,另一个用操作符。我的问题是将这两个堆栈转换为二叉树。

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

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

这样的二叉树
   *
 +    -
2 3  4 3

有没有办法以递归方式执行此操作?

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

  • 创建树的根,将root的值分配给operator-stack中的第一个运算符。将右指针和左指针设置为null。

  • 创建正确的节点,如果存在,则分配下一个运算符的值,如果不为其分配操作数。然后对左侧节点执行相同操作。

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

感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

假设您只有二元运算符

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

}

答案 1 :(得分:1)

递归算法:

  • 找到最高优先级的运算符
  • 拆分此运算符周围的表达式
  • 以递归方式应用于这两个部分

答案 2 :(得分:0)

如果你的表达式总是对称的(运算符每一侧的操作数和运算符数相同),那么你描述的方法工作正常,稍作修改:

  1. 创建一个节点,在运算符堆栈中指定top运算符的值。
  2. 如果操作员堆栈上没有操作符,则从操作数堆栈中弹出2个操作数并将它们分配给左右分支,然后退出
  3. 如果堆栈中有任何操作符,请转到节点的左侧brach并调用算法,然后转到右侧分支并调用算法。
  4. (Jan在答案中解释得非常清楚......)

答案 3 :(得分:0)

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