我有一个关于将字符串 s 解析为二叉树的问题。
struct TreeNode {
string val; // The data in this node.
TreeNode *left; // Pointer to the left subtree.
TreeNode *right; // Pointer to the right subtree.
};
string s="((OR (AND pass (NOT reject)) (AND (NOT pass) reject)))";
我做了一些笔画并消除了“(”和“)”并将所有单独的部分保留在向量后拆分中,后拆分有(底部)或并且通过不拒绝并且不通过拒绝(返回)
vector<string> aftersplit;
vector<TreeNode> parsetree;
while (!aftersplit.empty())//do the parsing
{
TreeNode *temp=new TreeNode;
temp->val=aftersplit.back();
temp->left=NULL;
temp->right=NULL;
aftersplit.pop_back();
if(temp->val=="AND"||temp->val=="OR"||temp->val=="=>"||temp->val=="<=>"){
TreeNode *leftnode = new TreeNode;
leftnode=&parsetree.back();
parsetree.pop_back();
temp->left=leftnode;
TreeNode *rightnode = new TreeNode;
rightnode=&parsetree.back();
parsetree.pop_back();
temp->right=rightnode;
parsetree.push_back(temp); //can not put the temp into parsetree
}
else if(temp->val=="NOT")
{
TreeNode *leftnode = new TreeNode;
leftnode=&parsetree.back();
parsetree.pop_back();
temp->left=leftnode;
parsetree.push_back(temp);
}
else {
parsetree.push_back(temp);
}
}
我从右到左处理字符串 s
但是,当我在运算符为“OR”时运行“TreeNode leftnode”时;左节点被分配了一个地址,该地址被第一个“与”的左孩子“pass”使用,也就是说,“与”指向他的左孩子地址0x00007fff6d8da7e0,新的临时左节点正在分配地址0x00007fff6d8da7e0 在那之后树就像
(AND) / \ / \ pass (NOT) / reject
在那个leftnode被分配“pass”的地址之后,它会喜欢
(AND) / \ / \ (AND) (NOT) / \ / / \ / (AND) (NOT) reject / \ / \ (AND) (NOT)
等等,都指向自己,我知道指针可能有问题,但我无法弄清楚。请帮我