2016-08-12 154 views
0

我试图找到二叉树的最小值。每次运行我的代码时,我都会得到一个长度为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]; 
} 

哪个呼叫的根的findMinimum - 根是一个节点

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

它会帮助人们帮助你,如果你把你的'Node'类型的定义和'insertValue' – CRD

+0

所使用的算法肯定,我加了上面的更多信息。谢谢! – user3353890

+1

您的属性'value'无疑应该是'int'类型而不是'int *' - 它是一个原始值而不是(对象)指针。所以你的'initWithValue:'可能做错了,就像你的'findMinimum'一样。如果这个评论给了你足够的线索来找到你的问题,请为你的'initWithValue'添加代码。 – CRD

回答

3

你都尽显你的树不是整数,但与立即无效,此代码堆栈地址:

self.value = &(val); 

这里val是一个参数变量,只要方法返回就会消失。考虑到它的地址只能在极少数情况下完成,并且该地址应该存储在一个超出val的地方,并且该地址应该是从来没有

Nodevalue属性的类型更改为int和去除的(&)地址和间接(*)的与该属性相关联的用途。

HTH

+0

非常感谢!这非常有帮助。愚蠢的错误把&运营商在那里与Xcode的自动修复和我没有真正注意。感谢您的详细解释! – user3353890

1

初始化程序中的指针赋值该参数不起作用。除非您有充分的理由不这样做,实际上通过声明int而不是int *int分配到Node结构中。所以,你的初始化看起来就像这样:

-(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; 
} 
+0

谢谢你,以及@CRD提供了正确的答案,从int *更改为int ...愚蠢的错误....也感谢你的recurisive最小算法。我会给它一个! – user3353890

+0

树已经按设计排序,不需要取左右子树的最小值--OP的原始算法很好(最小值是最左边,最大值是最右边)。 – CRD

+0

@CRD,你是对的。由于问题格式,我错过了插入排序。现在就解决这个问题。 – danh