Skip to content

Instantly share code, notes, and snippets.

@mthomason
Last active November 20, 2024 08:43
Show Gist options
  • Save mthomason/403768aea530e6c5fe1d213140ddeee8 to your computer and use it in GitHub Desktop.
Save mthomason/403768aea530e6c5fe1d213140ddeee8 to your computer and use it in GitHub Desktop.
This is a basic tree structure in Objective-C.
//
// 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
//
// 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