OC用二叉树实现省市区字典

该博客介绍了如何使用Objective-C(OC)编程语言,通过二叉树结构来实现对全国省市区数据的字典解析。首先,从area.txt文件中获取数据,然后创建TreeNode类进行数据存储和操作。
摘要由CSDN通过智能技术生成

首先我们需要一个全国省市区的文本文件area.txt

创建类 TreeNode

#import <Foundation/Foundation.h>

@interface TreeNode : NSObject

@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSMutableArray *subnodes;
@property (nonatomic, assign) TreeNode *superNode;


- (id)initWithNode:(NSString *)name;
+ (id)treeWithNode: (NSString *)name;
- (TreeNode *)getSubnodeWithNode:(NSString *)node;
- (TreeNode *)getAnynodeWithNode:(NSString *)node;
+ (void)traverseAllNode:(TreeNode *)root;
- (NSString *)getFullName;

@end

方法实现:
#import "TreeNode.h"

@implementation TreeNode



- (id)initWithNode:(NSString *)name{
    self = [super init];
    if (self) {
        [self setName:name];
        [self setSubnodes:[NSMutableArray array]];
    }
    return self;
}
+ (id)treeWithNode: (NSString *)name{
    TreeNode *node = [[TreeNode alloc]initWithNode:name];
    return node;
}
- (TreeNode *)getSubnodeWithNode:(NSString *)node{
    TreeNode *snode = nil;
    for (TreeNode *nd in self.subnodes) {
        if ([nd.name isEqualToString:node]) {
            snode = nd;
        }
    }
    return snode;
}
- (TreeNode *)getAnynodeWithNode:(NSString *)node{
    TreeNode *snode = nil;
    if ([self.name isEqualToString:node]) {
        snode = self;
    }else{
        for (TreeNode *nd in self.subnodes) {
            snode = [nd getAnynodeWithNode:node];
            if (snode != nil) {
                break;
            }
        }
    }
    return snode;
}
+ (void)traverseAllNode:(TreeNode *)root{
    NSLog(@"%@", root.name);
    for (TreeNode *nd in root.subnodes) {
        [TreeNode traverseAllNode:nd];
    }
}
- (NSString *)getFullName{
    NSMutableString *s = [NSMutableString string];
    TreeNode *n = self;
    while (n) {
        [s insertString:n.name atIndex:0];
        n = [n superNode];
    }
    return s;
}

@end



main.m

#import <Foundation/Foundation.h>
#import "TreeNode.h"



int main(int argc, const char * argv[]) {
   
    
    NSString *filePath = @"/Users/dllo/Desktop/OC/HomeWork/HomeWork-TreeNode/HomeWork-TreeNode/area.txt";
    NSString *buffer = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
    NSArray *array = [buffer componentsSeparatedByString:@"\n"];
    NSCharacterSet *cSet = [NSCharacterSet characterSetWithCharactersInString:@" 0123456789"];
    TreeNode *root = [TreeNode treeWithNode:@"China"];
    for (NSString *s in array) {
        TreeNode *parentNode = root;
        NSRange r = NSMakeRange(0, 2);
        NSString *s1 = [s substringWithRange:r];
        while ([s1 isEqualToString:@"  "]) {
            parentNode = [parentNode.subnodes lastObject];
            r.location += 2;
            s1 = [s substringWithRange:r];
        }
        NSString *nodeName = [s stringByTrimmingCharactersInSet:cSet];
        TreeNode *childNode = [TreeNode treeWithNode:nodeName];
        
        [parentNode.subnodes addObject:childNode];
        [childNode setSuperNode:parentNode];
    }
    
    TreeNode *node = [root getAnynodeWithNode:@"鼓楼区"];
    NSLog(@"%@", [node getFullName]);
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值