我已经很长时间没有实现二进制了,最近有一个要求这样做(为了演示一些代码),我开始使用:
@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/