如何找到二叉树的最小值?

时间:2016-08-12 04:42:10

标签: objective-c tree nodes

我正在尝试找到二叉树的最小值。每次运行我的代码时,我都会得到一个长的5位数字,如'32675'。我很确定我对指针的理解是错误的,但我并不积极。如果我能得到一些建议,我真的很感激。谢谢!

节点定义

@interface Node:NSObject {
    @property (nonatomic, strong) Node *left;
    @property (nonatomic, strong) Node *right;
    @property (nonatomic, assign) int *value;
}

-(id)initWithValue:(int)val {
    self = [super init];
    if(self) {
        self.value = &(val);
        self.left = nil;
        self.right = nil;
    }
    return self;
}

为树插入算法

-(void)insertValue:(int)value {
    Node *node = [[Node alloc] initWithValue:value];
    [self insertNode:node];
}

-(void)insertNode:(Node *)node {
    if (root == nil) {
        root = node;
    } else {
        [node insertNode:node];
    }
}

为节点插入算法

-(void)insertNode:(Node *)node{
    if (node.value < self.value) {
        [self insertOnLeft:node];
    } else {
        [self insertOnRight:node];
    }
}

-(void)insertOnLeft:(Node *)node {
    if (self.left == nil) {
        self.left = node;
    } else {
        [self.left insertNode:node];
    }
}

-(void)insertOnRight:(Node *)node {
    if (self.right == nil) {
        self.right = node;
    } else {
        [self.right insertNode:node];
    }
}

3个值进入我的树:

[tree insertValue:4];
[tree insertValue:6];
[tree insertValue:2];

int min = [tree findMinimum];

树的findMinimum方法称为

-(int)findMinimum {
    assert(root != nil);
    return [root findMinimum];
}

哪个调用的root的findMinimum - root是一个节点

-(int)findMinimum {
    Node *node = self;
    int min = 0;
    while (node != nil) {
        min = *(node.value);
        node = node.left;
    }
    return min;
}

2 个答案:

答案 0 :(得分:3)

您的树不是用整数填充,而是使用此代码立即无效的堆栈地址:

self.value = &(val);

这里val是一个参数变量,一旦方法返回就会消失。只有在极少数情况下才能使用其地址,并且该地址永远不会存储在比val更长的位置。

value的{​​{1}}属性类型更改为Node,并删除与(int)地址和间接(&)相关联的使用有这个属性。

HTH

答案 1 :(得分:1)

指向参数的指针的初始化程序中的赋值不起作用。除非您有充分的理由不这样做,否则将int实际分配到Node结构中,方法是将其声明为int,而不是int *。所以你的初始化程序将如下所示:

-(id)initWithValue:(int)val {
    self = [super init];
    if(self) {
        self.value = val;
    }
    return self;
}

编辑如果您没有对插入进行排序(我在OP中错过了),您可以按照以下方式递归搜索最小值:

-(int)findMinimum {
    if (self.left && self.right)
        return MIN([self.left findMinimum], [self.right findMinimum]);
    else if (self.left)
        return [self.left findMinimum];
    else if (self.right)
        return [self.right findMinimum];
    else
        return self.value;
}
相关问题