C++:在二叉树中插入节点的指针与指针的指针

2023-11-24

我正在创建一个函数来在二叉树中插入一个元素,首先,我在 Visual Studio 2012 上执行了以下操作:

void Insert(Nodo *root, int x){
   if(root == NULL){
      Nodo *n = new Nodo();
      n->value = x
      root = n;
      return;
   }
   else{
      if(root->value > x)
         Insert(&(root)->left, x);
      else
         Insert(&(root)->right, x);
   }
}

但同样的代码在 Dev-C++ 中不起作用,我需要使用 Pointer of Pointer 来使其工作,如下所示:

void Insert(Nodo **root, int x){
   if(*root == NULL){
      Nodo *n = new Nodo();
      n->value = x
      *root = n;
      return;
   }
   else{
      if((*root)->value > x)
         Insert(&(*root)->left, x);
      else
         Insert(&(*root)->right, x);
   }
}

有谁知道为什么会发生?


第一个代码不应编译。事实上它不能在 MSVC 2013 下编译。

Why ?

你的节点结构应该是这样的:

struct Nodo {
    int value; 
    Nodo*left, *right;  // pointer to the children nodes
};

这意味着(root)->left属于类型Nodo*。因此&(root)->left属于类型Nodo**这是不兼容的Nodo*争论。

不管怎样,在你的插入函数中,你肯定想改变树。但如果你这样做:root = n;您只需更新根参数(指针)。一旦您离开该功能,此更新就会丢失。在这里,您当然想要更改根节点的内容或更可能更改指向根节点的指针。

在第二个版本中,您将指向节点的指针的地址作为参数传递,然后在必要时更新该指针(预期行为)。

Remark

如果您想通过引用进行传递,则可以“保存”第一个版本:

void Insert(Nodo * &root, int x){  // root then refers to the original pointer 
   if(root == NULL){   // if the original poitner is null... 
      Nodo *n = new Nodo();
      n->value = x
      root = n;        // the orginal pointer would be changed via the reference    
      return;
   }
   else{
      if(root->value > x)
         Insert(root->left, x);   // argument is the pointer that could be updated
      else
         Insert(root->right, x);
   }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++:在二叉树中插入节点的指针与指针的指针 的相关文章

随机推荐

  • 运行 GAE devserver 时,jsessionID 会附加到 url

    由于某种原因 字符串如下 jsessionid SESSION HERE当我访问部署到 GAE 开发服务器的应用程序时 它会被添加到网址中 这会让事情变得混乱 因为对于某些 url 来说 它根本无法解析为 GET 参数 有时它最终会出现这样
  • 可变长度 rnn 填充和屏蔽填充梯度

    我正在构建一个 rnn 并使用 sequene length 参数来提供批次中序列的长度列表 并且批次中的所有序列都填充到相同的长度 然而 在进行反向传播时 是否可以屏蔽掉与填充步骤相对应的梯度 从而使这些步骤对权重更新的贡献为 0 我已经
  • 如何用另一个 JPanel 替换 JPanel

    我想用 JFrame 中的另一个 Jpanel 替换 Jpanel 我已经搜索并尝试了我的代码 但什么也没发生 这是我的代码 public class Frame extends JFrame private Container conta
  • HttpClient 和 PushStreamContent

    我将 PushStreamContent 与 REST API ASP NET Web API 结合使用 效果非常好 HttpClient 可以在服务器处理完整请求之前请求资源并获取 HTTP Response 服务器仍然写入推送流 作为
  • 在 Ruby 中查找多个正则表达式匹配的模式和位置

    这应该是一个简单的问题 但我找不到任何相关内容 给定 Ruby 中的正则表达式 对于每个匹配 我需要检索匹配的模式 1 2 但我还需要匹配的位置 我知道 运算符给我第一个匹配的位置 而string scan regex 给我所有匹配的模式
  • 当 scanf!=EOF 或 scanf==1 时?

    其他条件不变的情况下 格式良好的数据 良好的缓冲实践等等 是否有理由我更喜欢在返回时循环scanf是 1 而不是 EOF 我可能在某处读过这篇文章 或者其他什么 但我也可能有错 其他人怎么看 scanf返回成功转换的项目数 或错误时返回 E
  • 在 Android 中从一个活动移动到下一个活动

    我正在 Android 中开发一个具有登录屏幕的应用程序 现在我可以成功接收服务器的响应 成功响应后 它应该带我进入下一个活动或课程 在其中显示新的屏幕 活动 为了实现这个目标我应该做什么 在 Android 中 您可以使用 Intents
  • Linux 中的环境变量未使用 load_dotenv() 加载

    我正在尝试制作一个不和谐的机器人 当我尝试使用 load dotenv 加载 env 时 它不起作用 因为它说 Traceback most recent call last File home fanjin Documents Pytho
  • shell 中范围之间的随机数

    如何在 sh bin sh 而不是 bash 中生成 0 60 之间的随机数 这是卫星盒 没有 RANDOM变量和其他商品 cksum od od vAn N4 tu4 我想随机化 cron 作业时间 如果你有 tr head 和 dev
  • `PowerShell.Create()` 返回 null

    添加参考 PowerShellStandard Library 在默认情况下重现 net core项目 using System Management Automation using System Collections ObjectMo
  • 使用 Lion 上的 FSEvents 跟踪文件重命名/删除

    我正在尝试使用 FSEvents 来检测何时从特定文件夹添加 删除文件 目前 我围绕 FSEvents 实现了一个简单的包装器 它工作得很好 我得到了所有事件 但我现在遇到的问题是 当我在 Finder 中重命名文件时 我捕获了 2 个不同
  • 线程同步。为什么这个锁不足以同步线程[重复]

    这个问题在这里已经有答案了 可能的重复 线程同步 锁究竟如何使内存访问变得 正确 这个问题的灵感来自于这个 我们有以下测试课程 class Test private static object ms Lock new object priv
  • FXML 设置 TableView 列调整大小策略

    如何从 FXML 设置 TableView 的调整大小策略 我这样累了 但它不起作用
  • 使用 Homebrew 更新 OS X 上的 OpenSSL

    我使用的是 MacOS X 10 7 5 并且我需要更新的 OpenSSL 版本 因为握手失败 网上有很多教程 我尝试了以下方法 brew install openssl brew link openssl force 然而 它不起作用 o
  • mq_open() - 打开的文件太多

    我正在尝试编写一个客户端和服务器 它们将使用 POSIX 消息队列交换数据 我尝试通过查看在互联网上看到的示例和课程文档来做到这一点 但是 我陷入困境 当我运行它时 我收到 打开文件太多 错误 这是我的代码 Client int main
  • 将整数值范围映射到Python中的颜色

    我有从 0 到 10000 的整数 我想为每个整数映射一种颜色 然后根据整数值 我想检索与整数值对应的颜色的 RGB 等效值 基本上我想在两种或多种颜色之间有插值效果 例如如果颜色是绿色和红色 则绿色具有最小权重 0 红色具有最高权重 10
  • 使用 AJAX 通过 Flask-WTForms 将条目附加到 FieldList

    我使用 Flask WTForms 在 Flask 中制作了一个简单的表单 家长可以在其中注册自己和他的孩子 家长可以通过单击 添加孩子 按钮来注册任意数量的孩子 WTForms 通过使用 FieldList 功能使这变得非常容易实现 但是
  • LOAD DATA INFILE 轻松将 YYYYMMDD 转换为 YYYY-MM-DD?

    您好 我想导入一个 INFILE 但日期的形式为 AADR 20120403 31 43 31 43 31 4 31 4 1100 AAU 20120403 2 64 2 65 2 56 2 65 85700 AAVX 20120403 1
  • 将 mutate_at 有条件地应用于 R 中数据帧中的特定行

    我在 R 中有一个数据框 如下所示 a b c condition 1 4 2 acap 2 3 1 acap 2 4 3 acap 5 6 8 ncap 5 7 6 ncap 8 7 6 ncap 我正在尝试重新编码条件 ncap 的 a
  • C++:在二叉树中插入节点的指针与指针的指针

    我正在创建一个函数来在二叉树中插入一个元素 首先 我在 Visual Studio 2012 上执行了以下操作 void Insert Nodo root int x if root NULL Nodo n new Nodo n gt va