我有两个堆栈,一个用操作数,另一个用操作符。我的问题是将这两个堆栈转换为二叉树。
例如,表达式(2+3)*(4-3)
将被翻译成后缀(例如24+43-*
),然后放入两个堆栈
3442
和*-+
将成为堆栈(顶部分别为3和*)。
现在有了这些堆栈,我需要形成一个像
这样的二叉树 *
+ -
2 3 4 3
有没有办法以递归方式执行此操作?
现在,我有一个像这样的算法:
创建树的根,将root的值分配给operator-stack中的第一个运算符。将右指针和左指针设置为null。
创建正确的节点,如果存在,则分配下一个运算符的值,如果不为其分配操作数。然后对左侧节点执行相同操作。
我的问题是让这个递归,或让它来处理许多不同的情况。
感谢您的帮助。
答案 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)
如果你的表达式总是对称的(运算符每一侧的操作数和运算符数相同),那么你描述的方法工作正常,稍作修改:
(Jan在答案中解释得非常清楚......)
答案 3 :(得分:0)
一般来说,没有办法做到这一点。 “1 2 3 4”“* + /”是否表示“1 2 3 4 * + /”(即“1 /(2 + 3 * 4)”)或“1 2 * 3 + 4 /”,(即“(1 * 2 + 3)/ 4”)。