我是一个c ++ leaner,我正在尝试为这个表达式创建一个BST树:2346 * + / 8+,并按顺序和后序进行以获取修复版本和表达式的后缀版本。我很难为表达式创建二叉树。这是我的比索代码:
Tree:
Stack:
inorder fn{}
postorder fn{}
main{
input the file;
while(expression){
if(digit){
s.push}
else if(operator){
s.top = right;
s.pop;
s.top = left;
s.pop;
T1 = new Tree(operator, left, right);
}
}
我要创建的树就像这样
+
/ \
(/) 8
/ \
+ 2
/ \
* 3
/ \
4 6
我对这段代码的问题是在创建(4 * 6)树之后,我不能用(4 * 6)链接(+3)。请帮帮我。
感谢Drew McGowen,我已经更新了我的代码,现在我将4 * 6树推回堆栈,这里是代码:
while(input_file >> expression){
if(isdigit(expression[0])){
sscanf(expression,"%c",&digit);
printf("reading a number: %c \n",digit);
Tree* s.push(digit);
}
else {
sscanf(expression,"%c",&oper);
printf("reading an operator: %c \n",oper);
T1 = new Tree(s.top(), NULL, NULL);
s.pop();
T2 = new Tree(s.top(), NULL, NULL);
s.pop;
myTree = new Tree(oper, T1, T2);
s.push(myTree);
我一直收到错误消息,可以帮我查一下代码。谢谢你们。
大家好,我认为主要部分是在正确的轨道上,但我应该如何修改堆栈功能以接受树?这是我的堆栈功能:
void Stack::Push(char newthing) {
index++;
data[index] = newthing;
}
void Stack::Pop() {
if (index > -1) { index--; }
}
char Stack::Top() {
return data[index];
答案 0 :(得分:1)
您的堆栈似乎包含数字。为了将后置修复符号中的表达式解析为堆栈,堆栈应包含树元素。
伪代码:
main{
input the file;
while(expression){
if(digit){
s.push(new Tree(digit)); //create leaf-element
}
else if(operator){
Tree tr = s.pop();
Tree tl = s.pop();
T1 = new Tree(operator,tl,tr);
}
}
这或多或少也是L(AL)R解析器的工作方式。
关于您的代码:
T2
和T1
,因为您正在从堆栈中弹出; T1
和T2
应该是简单的弹出操作,没有构造函数调用;和你应该在数字大小写中构造一个树节点(leaf)。
while(input_file >> expression){
if(isdigit(expression[0])){
sscanf(expression,"%c",&digit);
printf("reading a number: %c \n",digit);
s.push(new Tree(digit,NULL,NULL)); //create new leaf
}
else {
sscanf(expression,"%c",&oper);
printf("reading an operator: %c \n",oper);
T2 = s.top(); //T2 instead of T1 and simple pop
s.pop();
T1 = s.top(); //T1 instead of T2 and simple pop
s.pop;
myTree = new Tree(oper, T1, T2);
s.push(myTree);
}
}
如果输入流是有效的(例如,不是1+
或12+6
),则结果是具有一个元素的堆栈:表达式树的根。