实现一个简单的二叉树

实现一个简单的二叉树,语言: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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Morris_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值