Objective-C 中的二叉树

2024-04-24

我正在学习算法和数据结构,并尝试使用 Objective-C 设计和实现二叉树进行训练。

到目前为止,我有以下课程:

  • main- 供测试用
  • Node- 树的节点
  • BinaryTree- 对于与树相关的所有方法

最早的方法之一BinaryTree我实现的类是insertNode:forRoot:.

- (void)insertNodeByRef:(Node **)node forRoot:(Node **)root{

    if (head == NULL) {
        head = *node;
    }
    // Case 2 root is null so can assign the value of the node to it
    if (root == NULL) {
        root = node;
    } else {
        if (node.data > root.data) { // to the right
            [self insertNode:node forRoot:root.right];
        } else if (node.data < root.data) { //or to the left
            [self insertNode:node forRoot:root.left];
        }
    }
}

的接口在哪里Node类看起来像:

@interface Node : NSObject

@property(nonatomic, assign) int data;
@property(nonatomic, strong) Node * right;
@property(nonatomic, strong) Node * left;

@end

我的问题是,如果我将 Node 作为引用传递,我不知道如何访问 Node 类成员变量。每当我尝试访问节点属性(例如数据,左侧或右侧)时,我都会收到以下错误消息:

Member reference base type 'Node *__autoreleasing *' is not a structure or union

所以我的问题是: 如何访问这些属性(数据,左或右)并使用它们来存储 int 数据或对另一个节点的引用?

希望这是有道理的。谢谢!


您的代码混合了两种常见的任务方法,因此出现了问题。您还使用抽象数据类型(ADT)类型的方法,而不是面向对象一,因此需要考虑三种方法。

在这两种 ADT 方法中,你的树都是通过对其根的引用来表示的,在 Objective-C 中,这可能存储在实例变量中:

Node *TreeRoot;

另请注意,这两种算法都使用字段引用,a->b,而不是属性引用,a.b- 这是因为前者引用了variable第二种算法需要传递对变量的引用。

函数式 ADT:按值传递并分配结果

在这种方法中,一个节点被插入到一棵树中,并且一个modified返回分配回来的树,例如插入的顶级调用Node nodeToInsert将会:

TreeRoot = insertNode(nodeToInsert, TreeRoot);

and the insertNode函数看起来像:

Node *insertNode(Node *node, Node *root)
{
   if(root == nil)
   {  // empty tree - return the insert node
      return node;
   }
   else
   {  // non-empty tree, insert into left or right subtree
      if(node->data > root->data) // to the right
      {
        root->right = insertNode(node, root->right);
      }
      else if(node->data < root->data)//or to the left
      {
        root->left = insertNode(node, root->left);
      }
      // tree modified if needed, return the root
      return root;
   }
}

请注意,在这种方法中,在非空(子)树的情况下,算法对变量执行冗余分配 - 分配的值是变量中已有的值......因此,有些人更喜欢:

程序 ADT:按引用传递

在这种方法中,保存(子)树根的变量是按引用传递的,而不是传递其值,并且由被调用的过程根据需要进行修改。例如。顶级调用将是:

insertNode(nodeToInsert, &TreeRoot); // & -> pass the variable, not its value

and the insertNode程序看起来像:

void insertNode(Node *node, Node **root)
{
   if(*root == nil)
   {  // empty tree - insert node
      *root = node;
   }
   else
   {  // non-empty tree, insert into left or right subtree
      Node *rootNode = *root;
      if(node->data > rootNode->data) // to the right
      {
        insertNode(node, &rootNode->right);
      }
      else if(node->data < rootNode->data)//or to the left
      {
        insertNode(node, &root->left);
      }
   }
}

您现在可以看到您的方法是上述两种方法的混合。两者都是有效的,但当您使用 Objective-C 时,最好采用第三种方法:

面向对象的ADT

这是过程 ADT 的变体 - 不是将变量传递给过程,而是将变量(现在称为变量)传递给过程。object,拥有一个method它会自行更新。这样做意味着您必须测试空(子)树before您调用插入节点,而前两种方法在调用中进行测试。所以现在我们有这个方法Node:

- (void) insert:(Node *)node
{
   if(node.data > self.data) // using properties, could also use fields ->
   {
      if(self.right != nil)
         [self.right insert:node];
      else
         self.right = node;
   }
   else if(node.data < rootNode.data)
   {
      if(self.left != nil)
         [self.left insert:node];
      else
         self.left = node;
   }
}

您还需要更改顶级调用以对空树执行相同的测试:

if(TreeRoot != nil)
   [TreeRoot insert:nodeToInsert];
else
   TreeRoot = nodeToInsert;

最后一点 - 如果您使用 MRC 而不是 ARC 或 GC 进行内存管理,您将需要插入适当的保留/释放调用。

希望能帮助您解决问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Objective-C 中的二叉树 的相关文章

  • 使用 Box2d 拖放 UIViews (iOS) [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我最近发现了一个很好的教程 用于使用
  • 如何为现有核心数据实体添加更多属性?

    我有一个正在使用核心数据的项目 我需要向现有实体 列 添加更多属性 列 如果我手动将属性添加到数据模型应用程序崩溃 这是由于我用来将数据插入表的上下文保存之前 请帮助 谢谢 所以我的问题是我不知道这个持久存储协调器代码去了哪里 事实证明它是
  • 如何在 O(n) 时间内遍历二叉树而不需要额外的内存

    给定一棵带有整数 左指针和右指针的二叉树 如何在 O n 时间和 O 1 额外内存 无堆栈 队列 递归 内遍历该树 This guy http nandacumar blogspot com 2006 06 traversing tree
  • 可以在 iOS 应用程序中全局禁用旋转吗?

    我有一个由很多视图控制器组成的应用程序 在项目摘要中 我已将纵向方向设置为唯一支持的设备方向 然而 该应用程序在横向旋转时仍然会变得混乱 我的问题是 有没有办法通过应用程序委托或其他方式全局禁用自动旋转 或者我是否必须进入所有视图控制器并添
  • iPhone 拒绝了发布请求 未说明

    iPhone 拒绝了发布请求 内部启动错误 进程启动失败 未指定 这个错误让我抓狂 我似乎无法解决它 我从发现的所有地方都做了以下操作 刷新证书 注销并进入开发者苹果帐户 下载手动证书 删除 Apple 全球证书 重新启动 Mac 和 iP
  • 如何在iOS SDK中使用语音识别? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我知道 SIRI 服务没有公共 API 但是有没有简单的语音识别 API 因此 如果我有一个文本字段并且
  • 该捆绑包在 Mac OS X 上无效

    我在将应用程序上传到应用程序商店时遇到问题 每次我将应用程序上传到苹果时 它都会显示 无效的二进制文件 因此我尝试在 Xcode Organizer 中验证存档的应用程序 但收到此错误 该捆绑包无效 Apple 目前不接受使用此版本 SDK
  • Swift 2 中的 segue 没有后退按钮

    我刚刚将我的项目移植到 Swift 2 一切都运行良好 除了即使是最简单的 segues 也没有后退按钮 这是我正在使用的 segue 函数的准备 override func prepareForSegue segue UIStoryboa
  • CognitoIdentityCredentials 无权对资源执行:lambda:InvokeFunction

    我正在尝试从 iOS 客户端调用 lambda 函数 我的代码如下所示 要获取凭据 请在 appDelegate 中 func application application UIApplication didFinishLaunching
  • NSTimer 每分钟运行一次,但在第一秒运行

    我有使用 NSTimer 每分钟运行一次的经验 例如 NSTimer scheduledTimerWithTimeInterval 60 0 target self selector Selector everyMinute userInf
  • 如何按日期正确对从 CoreData 获取的列表进行分组?

    为了简单起见 假设我想创建一个简单的待办事项应用程序 我的 xcdatamodeld 中有一个实体 Todo 其属性id title and date 以及以下 swiftui 视图 如图所示的示例 import SwiftUI struc
  • ios safari - getUserMedia 无法正常工作

    我真的有this https stackoverflow com q 45692526 6048715问题 但 OP 的解决方案对我不起作用 重申一下 我正在使用navigator mediaDevices getUserMedia 在浏览
  • 使用未解析的运算符 <=

    我正在尝试使用 Swift 3 for 循环 但没有成功 这是我所拥有的 for assumedPayRate Double in 0 25 lt billRate where assumedPayRate 0 25 On the lt 它
  • 将图像从资产库复制到应用程序文件夹

    我有一个 UIImagePickerController 我想将选定的图像保存到我的应用程序中 我可以通过获取当前的 UIImage 并保存它 通过创建文件 来轻松做到这一点 但我更愿意直接将文件从库复制到我的文件夹中 现在我有了所选图像的
  • UITableViewCell 中的自定义 VoiceOver 操作

    When a UITableView是可编辑的 其UITableViewCells允许用户在 VoiceOver 打开时执行自定义操作 当 VoiceOver 光标位于单元格上时 用户可以通过向上或向下滑动来听到可用的操作 然后通过双击屏幕
  • 我可以在没有苹果开发者帐户的真实苹果设备中测试我的 Flutter 应用程序吗?如果可以,我该怎么做?

    我已阅读以下内容那么问题 https stackoverflow com questions 54444538 how do i run test my flutter app on a real device and Article ht
  • 长按 UIButton

    我想知道如果有人按住 UIButton 按键的时间过长 我是否可以捕获 UIButton 的事件 通过通知或其他机制 比按一次按钮的时间更长 假设有人按住按钮几秒钟 谢谢 你可以加UILongPressGestureRecognizer h
  • iOS 15 中 UITableView 部分之间的额外空间

    UITableView显示没有节页脚的多个节 节之间有额外的空间 Xcode 的视图调试器显示它不是视图 而只是一个空白区域 就我而言 这种行为是不受欢迎的 添加 1 0 0 0 高度页脚并没有帮助 更改表视图也不行style 这是示例代码
  • Objective-C 中将 重新定义为另一种符号

    我们有一堂课WayPoint 但在某个时候 我们决定将类重命名为Placemark 然而 我们并不是真的想改变类的名称 因为这会导致现有代码的大量修改 因此 我添加了一行typedef在头文件的底部并开始使用Placemark从那以后 在任
  • 将相机移动到点击的 SCNNode

    我在用着SceneKit and Swift尝试移动相机 使其 聚焦 在所选节点上 我知道我启用了 defaultCameraController 但我试图通过调整相机的位置dolly rotate and translateInCamer

随机推荐

  • 重置rails中的主键id

    当我从表中删除所有并开始再次插入时 我遇到主键如何递增的问题 这是有问题的 因为我还有与已清除表关联的其他模型 例如 如果我有属于 Computer 的 Apple 那么当我清除 Computer 表并重新添加计算机时 关联会变得混乱 因为
  • Android 应用内计费:使用 sku android.test.purchased 时出错(响应:5:开发人员错误)

    我已通过标准助手发送了测试购买意向 String SKU android test purchased mHelper launchPurchaseFlow this SKU 10001 mPurchaseFinishedListener
  • 在 ngrx 上创建非记忆选择器

    是否可以在 ngrx 上创建非记忆选择器 我有一个非常小的选择器来检查存储中的值是否大于 Date now export const selectAuthState createFeatureSelector
  • Where 子句返回所有行中的值错误?

    我有一个如下所示的查询 SELECT id username FROM table name WHERE username 0 当我运行此查询时 MySQL 返回 table name 中的所有行 此外 如果我用 0 代替 false 我会
  • 如何在 Delphi 控制台应用程序中运行控制台应用程序?

    我希望我的控制台应用程序启动另一个控制台应用程序 显示另一个应用程序想要显示的所有内容 然后在另一个应用程序完成并退出后执行某些操作 基本上 Writeln Started ShellExecute 0 open another exe n
  • 处理Oauth 2.0-facebook gem错误100:此授权码已被使用

    我一直在为我的 Rails 应用程序设置 Facebook 身份验证 在测试时 使用我的 Facebook 帐户登录后 我不断收到此错误 OAuth2 Error error message This authorization code
  • Django:编程错误关系不存在

    设置新数据库heroku我试过python manage migrate并得到许多与相关的异常relation already exists does not exists 所以我按照这里的说明进行操作django 1 9 编程错误 关系
  • 如何避免添加多个 NSNotification 观察者?

    目前 API 似乎没有提供一种方法来检测是否已为特定 NSNotification 添加了观察者 除了在端维护一个标志来跟踪之外 避免添加多个 NSNotification 观察者的最佳方法是什么 有人已经创建了一个类别来促进这一点吗 防止
  • 如何设置 CirclePageIndicator 上的项目限制?

    I m using a ViewPager and a CirclePageIndicator from ViewPagerIndicator lib to show images with some circles below but t
  • Shadow DOM v1 CSS 填充

    https developers google com web fundamentals getting started primers shadowdom https developers google com web fundament
  • 如何在实体框架代码优先中设置 0..* 关系?

    我有两个类的下一个代码 public class Object public int ObjectID get set public int Object2ID get set public virtual Object2 Object2
  • MediaButtonIntentReceiver 在 Android 4.0+ 中不工作

    目标是拦截来自耳机以及蓝牙的广播 以响应来自耳机的不同类型的点击来改变媒体播放器 该解决方案适用于 ICS 之前的所有版本 这是我尝试过的一些代码和事情 private BroadcastReceiver mediaButtonReceiv
  • Wicket、页面堆栈和内存使用情况

    Wicket 应用程序序列化并缓存所有页面以支持有状态组件 以及支持后退按钮 以及其他可能的原因 我有一个使用 setResponsePage 在屏幕之间导航的应用程序 在很短的时间内 会话就会变得相当大 因为所有先前的页面都存储在会话中
  • 如何在 IIS 7.5 中启用 GZIP 压缩

    我想使用 GZIP 压缩我的文件 您能分享一下使用 GZIP 压缩文件的 web config 代码吗 上传 web config 文件后还需要做什么吗 GZip 压缩可以直接通过 IIS 启用 首先 打开IIS 转到您希望调整的网站并点击
  • 在 Docker 中使用私有模块构建 Go 应用程序

    我正在尝试在依赖于私有子模块的 docker 容器中构建一个 go 项目 我本来希望 mount type ssh会将我的 ssh 凭据传递给容器并且它会起作用 目前我可以在本地构建 只需制作GOPRIVATE变量集和git config
  • 从代码中获取全局色调颜色

    有没有办法通过代码从我的项目中获取全局色调颜色 为了避免误解 我指的是全局色调 我可以在文件检查器中设置它 Easy 目标C UIColor tintColor self view tintColor Swift let tintColor
  • 根据其他数据框的函数创建新的数据框

    我是 R 的新手 所以我可能很难提出我的问题 请多多包涵 我有两个数据框 为了解释起见 我们假设 df1 柱形代表收益类型 玉米 燕麦 小麦等 行代表一年中的月份 一月 二月等 Elements 代表在该特定月份购买的增益类型的每吨价格 d
  • 从Sql服务器中选择表并将数据插入到Mysql表中

    我有一个正在运行的 ms sql 服务器 并且希望将一些数据复制到 mysql 数据库 我已经可以连接到它们 所以我做了类似的事情 pdo new PDO SQLSERVER user password sql SELECT id name
  • 在 swift 中使用 UUID() 和 json

    我在网上找到了在 json 文件中使用硬编码 uuid 的示例 并且这些示例非常适合我 但是当我在应用程序中添加从 json 数组中删除项目的功能时 我需要动态创建这些 uuid 这是我的json文件 list json 它曾经有硬编码的i
  • Objective-C 中的二叉树

    我正在学习算法和数据结构 并尝试使用 Objective C 设计和实现二叉树进行训练 到目前为止 我有以下课程 main 供测试用 Node 树的节点 BinaryTree 对于与树相关的所有方法 最早的方法之一BinaryTree我实现