我决定尝试自学如何编程,并正在通过Python版“如何像计算机科学家一样思考”的方式工作。试图推迟询问有关练习的问题(因为重点是自己解决这些问题),但这个让我难过。
在第20章中,在介绍了Inorder遍历(使用表达式1 + 2 * 3)和遍历树并打印每个节点的函数之后,它会询问:“修改printTreeInorder,使其为每个运算符舍入括号,一对操作数“。我因此假设输出应该看起来像(1+(2)* 3)。
我一般都在使用递归函数,并且正在努力解决这个问题。我尝试在左右调用之前和之后插入括号,这不起作用,现在我认为函数堆栈将是五个深度 - 不要看我如何得到两对括号。
感觉就像一个警察要求,但是有人能把我带到正确的轨道吗?
谢谢,
比利。
答案 0 :(得分:2)
为每个运算符和一对操作数添加括号“。因此,我假设输出应该看起来像
(1+(2)*3)
。
我不认为这应该是输出。我认为输出应该是:(1+(2*3))
对我来说,最简单的方法是通过面向对象的方法。
让抽象类 Node
拥有抽象方法 GetExpressionString()
和 field Token
。
让类 Operand
继承自Node
并实施GetExpressionString()
,以便它返回Token
。 (例如'1'
或'2'
或'3'
)。
让类 Operator
继承自Node
,字段 Left
和Right
类型{{1}并实现Node
以便它返回GetExpressionString()
。例如,如果'(' + Left.GetExpressionString() + Token + Right.GetExpressionString() + ')'
,Left = '2'
和Right = '3'
,则结果为Token = '*'
。
然后
'(2*3)'
expression = new Operator(
Token='+',
Left=new Operand(Token='1'),
Right=new Operator(
Token='*',
Left=new Operand(Token='2'),
Right=new Operand(Token='3')))
的来电回复expression.GetExpressionString()
。
答案 1 :(得分:1)
C ++中的这段代码应该适合你:
void inorder(node1 *start)
{
if(!(start->left==NULL && start->right==NULL))
cout<<"(";
if(start->left!=NULL)
inorder(start->left);
cout<<start->value;
if(start->right!=NULL)
inorder(start->right);
if(!(start->left==NULL && start->right==NULL))
cout<<")";
}
答案 2 :(得分:0)
void inorder(TreeNode* p)
{
if(p)
{
if(p->left && p->right)
cout<<"(";
inorder(p->left);
cout<<p->data<<" ";
inorder(p->right);
if(p->left && p->right)
cout<<")";
}
}