鱼C论坛

 找回密码
 立即注册
查看: 1610|回复: 6

[已解决]C++....................二叉排序树引用传递

[复制链接]
发表于 2021-4-1 15:50:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 十泉浩 于 2021-4-1 15:51 编辑

问题在于第77行的插入函数和第35行构造函数中的调用
为什么在第一次插入的时候root可以随bt而改变
而在后面几次插入的时候root就不随bt而改变了



  1. #include <iostream>
  2. using namespace std;
  3. //BiNode
  4. template <typename DataType>
  5. struct BiNode
  6. {
  7.     DataType data;
  8.     BiNode* lchild, * rchild;
  9. };

  10. //BiSortTree
  11. template <typename DataType>
  12. class BiSortTree
  13. {
  14. public:
  15.     BiSortTree(DataType r[], int n);    //建立关键字序列r[0]~r[n-1]的二叉排序树
  16.     ~BiSortTree();       //析构函数,释放二叉排序树中所有结点,同二叉链表的析构函数
  17.     void InsertBST(BiNode<DataType>*& bt, DataType key);    //插入key
  18.     BiNode<DataType>* SearchBST(BiNode<DataType>* bt, DataType key);   //查找值为k的结点,返回值为k所在结点的地址
  19.     void InOrderBST(BiNode<DataType>* bt);   //中序遍历二叉树(递归)
  20.     BiNode<DataType>* GetRoot();//获取root值

  21. private:
  22.     BiNode<DataType>* root;    //二叉排序树(即二叉链表)的根指针
  23.     void Release(BiNode<DataType>*& bt);   //析构函数调用
  24. };

  25. //构造函数,将r[0]~r[n-1]各个元素依次插入,生成一棵二叉排序树
  26. template <typename DataType>
  27. BiSortTree<DataType>::BiSortTree(DataType r[], int n)//构造函数
  28. {
  29.     root = nullptr;  //初始化空二叉树
  30.     int i;
  31.     for (i = 0; i < n; i++) {   //进行n次插入
  32.         InsertBST(root, r[i]);//将结点s插入到二叉排序树中,这里的root一直不变!!所以在插入时的初始bt一直指向root的数
  33.     }
  34. }

  35. //析构函数,调用Release释放内存
  36. template <typename DataType>
  37. BiSortTree<DataType>::~BiSortTree()
  38. {
  39.     Release(root);
  40. }

  41. //释放二叉排序树的存储空间,调用析构函数实现
  42. template <typename DataType>
  43. void BiSortTree<DataType>::Release(BiNode<DataType>*& bt)
  44. {
  45.     if (bt) {
  46.         Release(bt->lchild);   //释放左子树
  47.         Release(bt->rchild);   //释放右子树
  48.         delete bt;
  49.     }
  50. }

  51. template <typename DataType>
  52. BiNode<DataType>* BiSortTree<DataType>::GetRoot()
  53. {
  54.     return root;
  55. }

  56. template <typename DataType>
  57. void  BiSortTree<DataType>::InOrderBST(BiNode<DataType>* bt)
  58. {
  59.     if (bt == nullptr) return;
  60.     else
  61.     {
  62.         InOrderBST(bt->lchild);
  63.         cout << bt->data << " ";
  64.         InOrderBST(bt->rchild);
  65.     }
  66. }

  67. //在下面补充实现相关算法
  68. template <typename DataType>
  69. void  BiSortTree<DataType>::InsertBST(BiNode<DataType>*& bt, DataType key)//35行使用  
  70. {
  71.     //1.如果不带 & 为什么不能传递:因为带 & 才能使树的改变保存下来
  72.     //2.是指针之间的传参必须用引用传参吗?如果要让改变不止存留在函数中,就要用引用传参
  73.     //3.如果用了引用传递,root的地址不会随bt的改变而改变吗:不会
  74.     //BiNode<DataType>* p = bt;
  75.     //如果不用&实现root将一直为空
  76.     if (bt == NULL)
  77.     {
  78.         BiNode<DataType>* p = NULL;
  79.         p = new BiNode<DataType>;
  80.         p->data = key;
  81.         p->lchild = NULL;
  82.         p->rchild = NULL;
  83.         bt = p;
  84.     }
  85.     else if (key == bt->data)
  86.     {
  87.         return;
  88.     }
  89.     else if (key > bt->data)
  90.     {
  91.         return InsertBST(bt->rchild, key);
  92.     }
  93.     else
  94.     {
  95.         return InsertBST(bt->lchild, key);
  96.     }
  97. }
  98. template <typename DataType>
  99. BiNode<DataType>* BiSortTree<DataType>::SearchBST(BiNode<DataType>* bt, DataType key)
  100. {
  101.     if (bt == NULL)return NULL;
  102.     else if (bt->data == key)return bt;
  103.     else if (bt->data > key)return SearchBST(bt->lchild, key);
  104.     else return SearchBST(bt->rchild, key);
  105.     //{
  106.     //    SearchBST(bt->lchild, key);
  107.     //    //cout << bt->data << " ";
  108.     //    if (bt->data == key) goto g;
  109.     //    SearchBST(bt->rchild, key);
  110.     //g:if (bt->data == key)return bt; else return NULL;
  111.     //}
  112. }

  113. //二叉排序树的主函数
  114. int main() {
  115.     int a[10], n;
  116.     n = 0;
  117.     while (1)
  118.     {
  119.         cin >> a[n];
  120.         if (!a[n])break;  //输入数据以0结束
  121.         n++;
  122.     }
  123.     BiSortTree<int> bst(a, n);//构造二叉排序树
  124.     BiNode<int>* root;
  125.     root = bst.GetRoot();
  126.     cout << "Inorder:";
  127.     bst.InOrderBST(root);//中序遍历二叉排序树(得到递增有序序列)
  128.     cout << endl;
  129.     int x;
  130.     cin >> x;
  131.     BiNode<int>* s;
  132.     s = bst.SearchBST(root, x);
  133.     if (s == nullptr) cout << "Find " << x << " failure";
  134.     else cout << "Find " << x << " success";
  135.     cout << endl;
  136.     return 0;
  137. }
复制代码
最佳答案
2021-4-3 00:20:09
提供一下下面这些信息
1. 这个程序的一组或多组输入
2. 你期望的输出结果
3. 程序现在的输出结果

知道了这3点,对调试程序很有帮助
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-1 15:52:55 | 显示全部楼层
当root为空的时候,第一次插入操作,root随bt而变为bt的地址
当root不为空的时候,也就是后几次插入操作,bt改变而root不改变(用调试测试过了)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-2 22:40:19 | 显示全部楼层
没人回答吗。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-3 00:20:09 | 显示全部楼层    本楼为最佳答案   
提供一下下面这些信息
1. 这个程序的一组或多组输入
2. 你期望的输出结果
3. 程序现在的输出结果

知道了这3点,对调试程序很有帮助
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-3 00:39:02 | 显示全部楼层
还需要一个,你在写这个代码的时候主要参考了哪篇文章?我需要先去看看这篇文章,看看你这个代码的编写思路
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-4 19:25:59 | 显示全部楼层
人造人 发表于 2021-4-3 00:20
提供一下下面这些信息
1. 这个程序的一组或多组输入
2. 你期望的输出结果

感谢提醒
我刚才看了一眼恍然大悟
第一次执行p=bt的时候(91行)引用的是root
而后面几次执行p=bt的时候都是引用的bt->right或者bt->left
所以后面几次不会改变root的地址

还是回答下您的提醒把
这是我们学校oj上的题目,,答案是正确的
就是对实现过程有些疑惑
参考资料就是王红梅老师的数据结构书

感谢你的回答,就把你设成最佳答案啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-4 19:39:35 | 显示全部楼层
十泉浩 发表于 2021-4-4 19:25
感谢提醒
我刚才看了一眼恍然大悟
第一次执行p=bt的时候(91行)引用的是root

^_^
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-30 07:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表