2015-05-17 36 views
0

什么,我想做一个简单的版本是把这样的树:
sample tree
到像这样的数组:“ABC”,“ABD “,”ae“]从根遍历树在Objective-C的所有儿童

基本上我想遍历从它的根节点到每个孩子的树。

我已经尝试通过在递归块中放入for-in循环来做到这一点,但问题是for循环会在每次块递归时重新开始。当我尝试异步运行该块时,我不断收到EXC_BAD_ACCESS

有什么建议吗?

+0

可以downvoter请解释投票吗? – Bogidon

+1

不是我的倒票,但我的猜测是,如果它包括你的代码,以及有关代码失败的一些细节,问题会更好。 – danh

+0

啊,你说得对。我的代码不幸的是太复杂了,所以我没有发布它:( – Bogidon

回答

3

说树是这样表示:

@interface TreeNode : NSObject 
@property(weak,nonatomic) TreeNode *parent; 
@property(strong,nonatomic) NSArray *children; 
@end 

的谱系(这是你在找什么)的任何节点,是从根到节点的节点列表。这可以像这样递归地定义:

- (NSArray *)lineage { 
    if (!self.parent) { 
     return @[self]; 
    } else { 
     NSMutableArray *lineage = [[self.parent lineage] mutableCopy]; 
     [lineage addObject:self]; 
     return lineage; 
    } 
} 

您正在寻找树叶的谱系,所以我们需要一种方法来收集树叶。如果我们可以遍历树,我们可以做到这一点。这是块很好的应用,像这样:

- (void)depthFirst:(void (^)(TreeNode *))block { 
    for (TreeNode *node in self.children) { 
     [node depthFirst:block]; 
    } 
    return block(self); 
} 

这提供了一个自然的方式来收集叶子:

- (NSArray *)leaves { 
    NSMutableArray *leaves = [@[] mutableCopy]; 
    [self depthFirst:^(TreeNode *node) { 
     if (!node.children) [leaves addObject:node]; 
    }]; 
    return leaves; 
} 

将其组合在一起,我们得到:

- (NSArray *)lineagesOfLeaves { 
    NSMutableArray lineages = [@[] mutableCopy]; 
    for (TreeNode *leaf in [self leaves]) { 
     [lineages addObject:[leaf lineage]]; 
    } 
    return lineages; 
} 

这些方法在树中的任何节点上工作。虽然,对于你的问题,你会想发送lineagesOfLeaves到树的根。

+1

你真的应该让'parent'属性'weak'而不是'strong'。否则你有圆形的强引用,因为数组保持强引用孩子的节点 – rmaddy

+0

非常好的点编辑 – danh

+0

感谢您的回答!还没有适应它到我的具体问题,但它在一个简单的试用。 – Bogidon