objective-c - 使用 leftChild 和 rightChild 实现二叉树是不好的做法吗?

标签 objective-c ios

我已经很长时间没有实现二进制了,最近有一个要求这样做(为了演示一些代码),我开始使用:

@interface NSNode : NSObject

@property (strong, nonatomic) NSNode *leftChild;
@property (strong, nonatomic) NSNode *rightChild;

但后来,似乎每当我需要对两个节点做某事时,我都需要写两次——一次为左 child ,一次为右 child ,除非我将需要做的事情变成一个额外的方法,并仔细传递适当的参数——将有很多额外的方法来完成这个。

如果它是通过使用 NSMutableArray 完成的

typedef enum {
    NSNodeLeft = 0,
    NSNodeRight
} NSNodeLeftOrRightSide;

@interface NSNode : NSObject

@property (strong, nonatomic) NSMutableArray *children;

然后我总是可以只使用一个循环来对两个节点做一些事情:

for (NSNode *node in self.children) {
    // do something
}

或者如果需要一个索引来判断它是左 child 还是右 child :

[self.children enumerateObjectsUsingBlock:
    ^(NSNode *node, NSUInteger nodeIndex, BOOL *stop) {
        // do something
    }
];

nodeIndex可以用来判断它是左 child 还是右 child 。

更重要的是,这个类可以很容易地扩展到一个有 N 个 child 的树。这实际上是更好的做法吗?除了使用数组的性能非常低外,还有什么缺点吗? (我选择了 NSMutableArray 而不是 NSArray 因为如果我们需要制作这个 N-children,我们不需要将它更改为 NSMutableArray到处都是)。

最佳答案

当你需要对两个 child 都做某事时,你总是可以使用数组

for (Node *node in @[self.leftChild, self.rightChild]) {
    // ...
}

如果你想让它更简单,你可以定义一个方法 - (NSArray *)children 返回 @[self.leftChild, self.rightChild] .但是将可变属性保留为不同的子节点很有用,因为它明确编码了这样一个事实,即您的节点只有 2 个子节点,而不是无限数量的子节点。

关于objective-c - 使用 leftChild 和 rightChild 实现二叉树是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12328261/

相关文章:

ios - 当 VoiceOver 打开时,应用程序是否可以检测单指(左右)滑动?

objective-c - iOS 6 上奇怪的 tableViewCell 问题

iphone - NSFetchedResultsController - 何时触发委托(delegate)方法?

ios - ScrollView 未在 ios 中的导航栏下加载

iphone - 客户端证书 iOS

ios - 根据名称或包标识符获取 iOS 应用程序的路径

ios - 如何自定义 FSCalendar

ios - 向特定用户发送远程推送通知

objective-c - PrepareForSegue 与 UIImagePickerController

ios - 在 ARC 模式下释放对象