使用解引用的C++二叉搜索树Insert函数报错,求代码排查帮助
二叉搜索树Insert函数的错误排查与修复
嗨,我帮你找出了代码里的关键问题,咱们逐个分析并修复:
存在的错误点
- 比较逻辑错误:在
else if(data <= root)这一行,root是BstNode**类型(指向指针的指针),你无法直接将整数data和二级指针做比较。正确的做法是先解引用root得到当前节点的指针*root,再访问它的data成员,也就是(*root)->data。 - 递归调用参数错误:
- 原代码里的
Insert(*(root->left), data)和Insert(*(root->right), data)完全不符合语法要求:首先root是二级指针,没有left/right成员;其次Insert函数接收的是BstNode**类型参数,你需要传递当前节点左/右子树指针的地址,也就是&((*root)->left)和&((*root)->right)。
- 原代码里的
修正后的完整代码
struct BstNode { int data; BstNode *left; BstNode *right; }; BstNode *GetNewNode(int); void Insert(BstNode **, int); void Insert(BstNode **root, int data) { if(*root == NULL){ *root = GetNewNode(data); } else if(data <= (*root)->data){ // 修正比较逻辑 Insert(&((*root)->left), data); // 修正递归参数,传递左子树指针的地址 } else { Insert(&((*root)->right), data); // 修正递归参数,传递右子树指针的地址 } } BstNode *GetNewNode(int data) { BstNode *newNode = new BstNode(); newNode->data = data; newNode->left = newNode->right = NULL; return newNode; } int main () { BstNode *root = NULL; Insert(&root,15); Insert(&root,10); Insert(&root,20); return 0; }
额外说明
修正后的代码可以正确递归插入节点:每次递归时,我们传递的是当前节点左/右子树指针的地址,这样在递归到空节点时,才能正确修改父节点的子指针,完成节点插入操作。
内容的提问来源于stack exchange,提问作者Shawn W W
相关产品推荐
相关产品推荐

