在写二叉搜索树插入函数的时候,如果给定二叉树是空,就把插入节点作为根节点,这里我简单的把插入节点复制给树根节点。
退出函数以后,根节点没有值。
void insert(TreeNode* root, TreeNode &node)
{
...
if (pnode == nullptr)
root = &node;
...
}
问题出在指针传递时是拷贝传值,我们可以通过这个指针值修改指向内存的内容,但是当改变这个指针值,让它指向其他内存时,是影响不到外部实参指针的。
那如何在其他函数中改变指针指向的内存呢? 有几种方法:
1. 上面提到问题出在root是拷贝传参,所以不能修改外部的root。那么我们可以传root的指针或者引用(指针的指针,指针的引用)。
2. 使用return,在函数中创建动态内存,并返回一个指向内存的指针,赋值给外部的root就可以了
对第一种方法举例:
void testPointer(TreeNode** node)
{
TreeNode* ttnode = (TreeNode*)malloc(sizeof(TreeNode));
ttnode->val = 3;
*node = ttnode;
cout << *node << "\n";
}
int main()
{
TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
node->val = 5;
cout << node << "\n";
testPointer(&node);
cout << node << "\n";
cout << node->val;
}
输出结果:
可以看到node指向的内存确实更改了。