c递归二进制
我理解插入的“规则”c递归二进制,c,algorithm,binary-tree,prefix-tree,C,Algorithm,Binary Tree,Prefix Tree,我理解插入的“规则” void printTree(BTNode* node) { if (node == NULL) return; printTree(node->left); printf("%c", node->item); printTree(node->right); } 在createExp中,右节点可能是使用左节点已经解析的一些字符构建的。每次左节点解析多个字符时都会发生这种情况
void printTree(BTNode* node) {
if (node == NULL)
return;
printTree(node->left);
printf("%c", node->item);
printTree(node->right);
}
在
createExp
中,右节点可能是使用左节点已经解析的一些字符构建的。每次左节点解析多个字符时都会发生这种情况
为了防止出现这种情况,createExp
应该返回解析结束位置的信息。大概是这样的:
char *createExpTree(BTNode** root, char* prefix)
{
if (*prefix) {
if (!isdigit(*prefix)) {
*root = malloc(sizeof(BTNode));
(*root)->item = *prefix;
(*root)->left = NULL;
(*root)->right = NULL;
}
else {
*root = malloc(sizeof(BTNode));
(*root)->item = *prefix;
(*root)->left = NULL;
(*root)->right = NULL;
return prefix;
}
}
prefix = createExpTree(&(*root)->left, ++prefix);
return createExpTree(&(*root)->right, ++prefix);
}
如果需要保留createExpTree
签名,可以将递归展平为如下循环:
void createExpTree(BTNode** root, char* prefix)
{
BTNode** stack[SIZE];
int stackPosition = 0;
while (*prefix) {
*root = malloc(sizeof(BTNode));
(*root)->left = NULL;
(*root)->right = NULL;
if (isdigit(*prefix)) {
(*root)->item = *prefix++;
if (stackPosition == 0) break;
root = stack[--stackPosition];
}
else {
(*root)->item = *prefix++;
stack[stackPosition++] = &(*root)->right;
root = &(*root)->left;
}
}
}
createExpTree的签名错误。要解析前缀表达式,在开始解析右操作数之前,需要知道左操作数的结束位置。您的函数不会报告光标的最终位置。谢谢。然而,签名不应更改,因此我不能做你的风格很遗憾。您有什么建议可以在不更改签名的情况下执行此操作吗?您可以将
前缀
变量设置为全局变量,并将第二个伪参数传递给createExpTree
函数以保留相同的签名。但很多人,包括我在内,都会认为这是一个肮脏的解决方案……解决方案可能是将递归性展平成一个循环。你有什么提示给我吗?我切换到递归,因为我不能迭代地执行它。我在原始文章中添加了Stack Struct,我可以用它来帮助我构建树。如果你有数字限制(200),那么你可能不需要Struct来使用堆栈,一个简单的数组就足够了。