Last active
November 20, 2024 08:43
-
-
Save mthomason/403768aea530e6c5fe1d213140ddeee8 to your computer and use it in GitHub Desktop.
This is a basic tree structure in Objective-C.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// MTTree.h | |
// libMTDataStrutures | |
// | |
// Created by Michael Thomason on 6/21/14. | |
// Copyright © 2024 Michael Thomason. All rights reserved. | |
// | |
#ifndef MAD_DataStructures_MTTree_h | |
#define MAD_DataStructures_MTTree_h | |
#import <Foundation/NSObject.h> | |
#ifndef NS_DESIGNATED_INITIALIZER | |
#if __has_attribute(objc_designated_initializer) | |
#define NS_DESIGNATED_INITIALIZER __attribute((objc_designated_initializer)) | |
#else | |
#define NS_DESIGNATED_INITIALIZER | |
#endif | |
#endif | |
@interface MTTree : NSObject | |
@property (nonatomic, strong, nullable) id data; | |
@property (nonatomic, strong, nullable) MTTree *leftNode; | |
@property (nonatomic, strong, nullable) MTTree *rightNode; | |
- (instancetype)initWithData:(nullable id)data | |
leftTree:(nullable MTTree *)left | |
rightTree:(nullable MTTree *)right NS_DESIGNATED_INITIALIZER; | |
- (instancetype)initWithData:(nullable id)data; | |
- (void)insertLeft:(id)data; | |
- (void)insertRight:(id)data; | |
- (NSArray *)preOrderTraversal; // Root -> Left -> Right | |
- (NSArray *)inOrderTraversal; // Left -> Root -> Right | |
- (NSArray *)postOrderTraversal; // Left -> Right -> Root | |
@end | |
#endif |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// MTTree.m | |
// libMTDataStrutures | |
// | |
// Created by Michael Thomason on 6/21/14. | |
// Copyright © 2024 Michael Thomason. All rights reserved. | |
// | |
#import "MTTree.h" | |
#import <Foundation/NSArray.h> | |
#import <Foundation/NSNull.h> | |
@implementation MTTree | |
- (instancetype)init { | |
return [self initWithData:nil leftTree:nil rightTree:nil]; | |
} | |
- (instancetype)initWithData:(nullable id)data | |
leftTree:(nullable MTTree *)left | |
rightTree:(nullable MTTree *)right { | |
if (self = [super init]) { | |
self.data = data; | |
self.leftNode = left; | |
self.rightNode = right; | |
} | |
return self; | |
} | |
- (instancetype)initWithData:(nullable id)data { | |
return [self initWithData:data leftTree:nil rightTree:nil]; | |
} | |
#pragma mark - Insertion Methods | |
- (void)insertLeft:(id)data { | |
if (!self.leftNode) { | |
self.leftNode = [[MTTree alloc] initWithData:data]; | |
} else { | |
MTTree *newNode = [[MTTree alloc] initWithData:data]; | |
newNode.leftNode = self.leftNode; | |
self.leftNode = newNode; | |
} | |
} | |
- (void)insertRight:(id)data { | |
if (!self.rightNode) { | |
self.rightNode = [[MTTree alloc] initWithData:data]; | |
} else { | |
MTTree *newNode = [[MTTree alloc] initWithData:data]; | |
newNode.rightNode = self.rightNode; | |
self.rightNode = newNode; | |
} | |
} | |
#pragma mark - Tree Traversal | |
- (NSArray *)preOrderTraversal { | |
NSMutableArray *result = [NSMutableArray array]; | |
[result addObject:self.data ?: [NSNull null]]; | |
if (self.leftNode) { | |
NSArray *leftTraversal = [self.leftNode preOrderTraversal] ?: @[]; | |
[result addObjectsFromArray:leftTraversal]; | |
} | |
if (self.rightNode) { | |
NSArray *rightTraversal = [self.rightNode preOrderTraversal] ?: @[]; | |
[result addObjectsFromArray:rightTraversal]; | |
} | |
return result; | |
} | |
- (NSArray *)inOrderTraversal { | |
NSMutableArray *result = [NSMutableArray array]; | |
if (self.leftNode) { | |
NSArray *leftTraversal = [self.leftNode inOrderTraversal] ?: @[]; | |
[result addObjectsFromArray:leftTraversal]; | |
} | |
[result addObject:self.data ?: [NSNull null]]; | |
if (self.rightNode) { | |
NSArray *rightTraversal = [self.rightNode inOrderTraversal] ?: @[]; | |
[result addObjectsFromArray:rightTraversal]; | |
} | |
return result; | |
} | |
- (NSArray *)postOrderTraversal { | |
NSMutableArray *result = [NSMutableArray array]; | |
if (self.leftNode) { | |
NSArray *leftTraversal = [self.leftNode postOrderTraversal] ?: @[]; | |
[result addObjectsFromArray:leftTraversal]; | |
} | |
if (self.rightNode) { | |
NSArray *rightTraversal = [self.rightNode postOrderTraversal] ?: @[]; | |
[result addObjectsFromArray:rightTraversal]; | |
} | |
[result addObject:self.data ?: [NSNull null]]; | |
return result; | |
} | |
@end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment