为何第一种BinTree创建函数失效?char*与char**传参差异解惑
二叉树创建函数的参数差异解析
我希望创建如图所示的二叉树:
以下是无法正常生成目标二叉树的实现代码:
typedef struct BinNode { Elemtype data; struct BinNode* left; struct BinNode* right; }BinNode,*BinTree; void createBinTree(BinTree* root, char* a) { if (*a == '\0') return; if (*a == '#') { (*root) = NULL; return; } else { (*root) = (BinTree)malloc(sizeof(BinNode)); assert((*root) != NULL); (*root)->data = *a; createBinTree(&(*root)->left, ++a); createBinTree(&(*root)->right, ++a); return; } } int main() { char* ptr = "ABC##DE##F##G#H##"; BinTree my_tree = NULL; createBinTree(&my_tree,ptr); return 0; }
而以下实现可以正常生成目标二叉树:
void createBinTree(BinTree* root, char** a) { if (**a == '\0') return; if (**a == '#') { (*root) = NULL; (*a)++; return; } else { (*root) = (BinTree)malloc(sizeof(BinNode)); assert((*root) != NULL); (*root)->data = **a; (*a)++; createBinTree(&(*root)->left, a); createBinTree(&(*root)->right, a); return; } } int main() { char* ptr = "ABC##DE##F##G#H##"; BinTree my_tree = NULL; createBinTree(&my_tree,&ptr); return 0; }
我不理解为何调用createBinTree需要传递&ptr而非直接传ptr,恳请解答!
问题解析
核心原因是C语言的参数传递是值传递,我们需要在递归过程中持续推进字符串的遍历指针,让所有递归调用共享同一个指针的状态:
- 第一个版本的问题:
函数参数是char* a,调用时传入的ptr会被复制一份作为函数内的局部变量a。当执行++a时,只是修改了这个局部副本的指向,不会影响主函数里的ptr。递归创建左子树后,回到当前层创建右子树时,a还是原来的位置,导致字符串的遍历顺序完全错误,无法构建正确的二叉树。 - 第二个版本的解决思路:
函数参数改为char** a,传入的是&ptr——也就是指针的指针。此时函数内的(*a)直接对应主函数里的ptr,执行(*a)++时,修改的是ptr本身的指向。所有递归调用都会共享这个指针的状态,每处理一个字符就推进一次指针,保证整个字符串按顺序被遍历,从而正确构建出目标二叉树。
内容的提问来源于stack exchange,提问作者Ly丶Cooki
相关产品推荐
相关产品推荐

