#头文件
@interface YFTree<__covariant ObjectType> : NSObject
/**
根节点的值
*/
@property (nonatomic, strong) ObjectType rootData;
@property (nonatomic, strong) YFTree *leftTree;
@property (nonatomic, strong) YFTree *rightTree;
+ (instancetype)treeWithRootData:(ObjectType)rootData;
+ (instancetype)treeWithRootDate:(ObjectType)rootData leftTree:(YFTree *)leftTree rightTree:(YFTree *)rightTree;
/**
返回前序遍历的数据组
@return 遍历的数据
*/
- (NSArray<ObjectType> *)preOrder;
/**
返回中序遍历的数据组
@return 遍历的数据
*/
- (NSArray<ObjectType> *)inOrder;
/**
返回后序遍历的数据组
@return 遍历的数据
*/
- (NSArray<ObjectType> *)postOrder;
/**
逐层遍历
@return 遍历的数据
*/
- (NSArray<ObjectType> *)levelOrder;
@end
#实现文件
@implementation YFTree
+ (instancetype)treeWithRootData:(id)rootData {
YFTree *newObj = [YFTree new];
newObj.rootData = rootData;
return newObj;
}
+ (instancetype)treeWithRootDate:(id)rootData leftTree:(YFTree *)leftTree rightTree:(YFTree *)rightTree {
YFTree *newObj = [YFTree new];
newObj.rootData = rootData;
newObj.leftTree = leftTree;
newObj.rightTree = rightTree;
return newObj;
}
- (NSArray *)preOrder {
NSMutableArray *objects = [[NSMutableArray alloc] init];
if (_rootData) {
[objects addObject:_rootData];
}
if (_leftTree) {
[objects addObjectsFromArray:[_leftTree preOrder]];
}
if (_rightTree) {
[objects addObjectsFromArray:[_rightTree preOrder]];
}
return [objects copy];
}
- (NSArray *)inOrder {
NSMutableArray *objects = [[NSMutableArray alloc] init];
if (_leftTree) {
[objects addObjectsFromArray:[_leftTree preOrder]];
}
if (_rootData) {
[objects addObject:_rootData];
}
if (_rightTree) {
[objects addObjectsFromArray:[_rightTree preOrder]];
}
return [objects copy];
}
- (NSArray *)postOrder {
NSMutableArray *objects = [[NSMutableArray alloc] init];
if (_leftTree) {
[objects addObjectsFromArray:[_leftTree preOrder]];
}
if (_rightTree) {
[objects addObjectsFromArray:[_rightTree preOrder]];
}
if (_rootData) {
[objects addObject:_rootData];
}
return [objects copy];
}
- (NSArray *)levelOrder {
//添加首个元素
NSMutableArray *objects = [[NSMutableArray alloc] init];
[objects addObject:_rootData];
NSMutableArray *bufferQueue = [[NSMutableArray alloc] init];
[bufferQueue addObject:_leftTree];
[bufferQueue addObject:_rightTree];
YFTree *markTree;
while ([bufferQueue count] > 0) {
markTree = [bufferQueue firstObject];
[objects addObject:markTree.rootData];
if (markTree.leftTree) {
[bufferQueue addObject:markTree.leftTree];
}
if (markTree.rightTree) {
[bufferQueue addObject:markTree.rightTree];
}
[bufferQueue removeObject:markTree];
}
return [objects copy];
}
@end