c++ - 是否可以仅通过将指针作为参数传递来复制二叉搜索树?
问题描述
对于赋值,我正在编写一个带有辅助函数的复制构造函数。
binarytree::binarytree(binarytree& right) {
copy(root, right.root);
}
还有我的复制功能:
void binarytree::copy(treenode*& copyRoot, const treenode* root) {
if (root != nullptr) {
//copy data
//copy left
copy(copyRoot->left, root->left);
//copy right
copy(copyRoot->right, root->right);
}
到目前为止,按预期制作 BST 的副本。但是,我的分配指定该函数将是静态的、无效的,并且有两个 treenode* 参数。是否可以使用treenode* copyRoot
作为参数而不是重写此函数treenode*& copyRoot
?
如果我按原样更改函数参数,则函数的副本不会被保存,并且在我测试时打印出一个空的 BST。
解决方案
是否可以使用 treenode* copyRoot 作为参数而不是 treenode*& copyRoot 来重写此函数?
我假设目标binarytree::copy()
是创建 treenode
(行copyRoot = new treenode();
建议)的新副本,所以对于这种情况......
不,你不能那样做。
通过treenode*& copyRoot
参数声明,您正在“返回”指针,而treenode* copyRoot
意味着您正在将指针传递给copy()
方法,并且结果在copy()
方法内部实际上您有该指针的另一个副本。
这种情况下最好的说明是void cpy(int& i)
和void cpy(int i)
方法。后一种情况不会改变传递给方法的 int 。现在替换int
为int*
,这应该是对您的问题的非常直接的解释。
推荐阅读
- python - pandas dataframe - 从特定条件下获取价值
- mongodb - 创建 mongodb 数据库并通过 docker-compose 填充一些数据
- android - Android - 共享偏好
- swift - 我可以在`map`和`flatMap`函数中做一些不是`transfrom`的事情吗?
- python - 在 Sagemaker jupyter 笔记本上找不到 Gluonnlp 安装
- laravel - 如何在 laravel 中使用中间件保护路由?
- angular - dom可以隐藏在ng-template里面吗
- spring - 函数保存房间表而不是预订表的新记录(预订表有 room_id 作为外键)
- excel - 隐藏行的宏不会隐藏每一行
- php - 每个对象的最低计数