实现一个简单的二叉树,语言:Objective-C。整体上还是挺简单的,所以就直接上代码了。
1. 二叉树
由“节点”和“枝干”组成,且每个节点最多只有两个子节点的树形数据结构。
2. 代码实现
2.1 节点类
创建一个简单的节点类,这个类可以保存节点数据,有父节点,左节点,右节点。
MMNode.h
/// 节点
@interface MMNode : NSObject
@property (nonatomic) int data; // 节点数据
@property (nonatomic, strong) MMNode *top; // 父节点
@property (nonatomic, strong, nullable) MMNode *left; // 左子节点
@property (nonatomic, strong, nullable) MMNode *right; // 右子节点
// Node子节点数
- (NSInteger)countNodes;
// 叶子数
- (NSInteger)countLeaves;
@end
MMNode.m
#import "MMNode.h"
@implementation MMNode
- (NSInteger)countNodes
{
return CountNodes(self);
}
- (NSInteger)countLeaves
{
return CountLeaves(self);
}
- (void)setTop:(MMNode *)top
{
if (top) {
if (!top.left) { // 添加为左节点
top.left = self;
}
else if (!top.right) { // 添加为右节点
top.right = self;
}
else { // 默认添加为左节点
top.left = self;
}
}
}
int CountNodes(MMNode * node)
{
if (node == nil) {
return 0;
}
return CountNodes(node.left) + CountNodes(node.right) + 1;
}
int CountLeaves(MMNode * node)
{
if (node == nil)
return 0;
if (!node.left && !node.right)
return 1;
return CountLeaves(node.left) + CountLeaves(node.right);
}
@end
2.2 二叉树
创建一个二叉树类,简单实现一个二叉树。
MMTree.h
#import <Foundation/Foundation.h>
#import "MMNode.h"
NS_ASSUME_NONNULL_BEGIN
// 二叉树
@interface MMTree : NSObject
// 首节点
@property (nonatomic, strong, nullable) MMNode *rootNode;
// 添加"左孩子"(左节点)
- (BOOL)addLeftNode:(nullable MMNode *)left inNode:(MMNode *)node;
// 添加”右孩子“(右节点)
- (BOOL)addRightNode:(nullable MMNode *)right inNode:(MMNode *)node;
// 求节点数
- (NSInteger)countNodes;
// 叶子数
- (NSInteger)countLeaves;
@end
NS_ASSUME_NONNULL_END
MMTree.m
#import "MMTree.h"
@implementation MMTree
- (BOOL)addLeftNode:(nullable MMNode *)left inNode:(MMNode *)node {
if (node) {
node.left = nil;
node.left = left;
return YES;
}
return NO;
}
- (BOOL)addRightNode:(nullable MMNode *)right inNode:(MMNode *)node {
if (node) {
node.right = nil;
node.right = right;
return YES;
}
return NO;
}
- (NSInteger)countNodes {
if (self.rootNode) {
return [self.rootNode countNodes];
}
return 0;
}
- (NSInteger)countLeaves {
if (self.rootNode) {
return [self.rootNode countLeaves];
}
return 0;
}
@end
2.3 测试代码
#import <Foundation/Foundation.h>
#import "MMTree.h"
#import "MMNode.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 创建一个二叉树对象
MMTree *tree = [[MMTree alloc] init];
// 创建二叉树的跟节点
MMNode *rootNode = [[MMNode alloc] init];
rootNode.data = 0;
tree.rootNode = rootNode;
/**
0
*/
// 添加一些字节点
MMNode *node10 = [[MMNode alloc] init];
MMNode *node11 = [[MMNode alloc] init];
node10.data = 10;
node11.data = 11;
[tree addLeftNode:node10 inNode:rootNode];
[tree addRightNode:node11 inNode:rootNode];
/**
0
10 11
*/
MMNode *node20 = [[MMNode alloc] init];
MMNode *node21 = [[MMNode alloc] init];
node20.data = 20;
node21.data = 21;
[tree addLeftNode:node20 inNode:node10];
[tree addRightNode:node21 inNode:node10];
/**
0
10 11
20 21
*/
MMNode *node32 = [[MMNode alloc] init];
MMNode *node33 = [[MMNode alloc] init];
node32.data = 32;
node33.data = 33;
[tree addLeftNode:node32 inNode:node21];
[tree addRightNode:node33 inNode:node21];
/**
0
10 11
20 21
32 33
*/
MMNode *node30 = [[MMNode alloc] init];
node30.data = 30;
[tree addLeftNode:node30 inNode:node20];
/**
0
10 11
20 21
30 32 33
*/
MMNode *node44 = [[MMNode alloc] init];
node44.data = 44;
node44.top = node33; // 默认添加在父节点的左节点上
/**
0
10 11
20 21
30 32 33
44
*/
NSLog(@"%ld",(long)[tree countNodes]);
NSLog(@"%ld",(long)[tree countLeaves]);
}
return 0;
}