【问题标题】:How do I find the minimum value of a binary tree?如何找到二叉树的最小值?
【发布时间】:2016-08-12 13:26:18
【问题描述】:

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

调用Tree的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;
}

【问题讨论】:

  • 如果您添加Node类型的定义和insertValue使用的算法,它将帮助人们帮助您
  • 当然,我在上面添加了更多信息。谢谢!
  • 您的属性value 无疑应该是int 类型而不是int * - 它是一个原始值而不是(对象)指针。所以你的initWithValue: 可能做错了,你的findMinimum 也是。如果此评论为您提供了足够的线索来找到您的问题,请为您的 initWithValue 添加代码。
  • 成功了,非常感谢!

标签: objective-c tree nodes


【解决方案1】:

你不是用整数填充你的树,而是用这个代码立即无效的堆栈地址:

self.value = &(val);

这里val是一个参数变量,方法一返回就会消失。只应在极少数情况下获取其地址,并且该地址绝不应存储在比val 寿命更长的位置。

Nodevalue 属性类型更改为int,并删除与该属性关联的(&amp;) 地址和间接(*) 的使用。

HTH

【讨论】:

  • 非常感谢!这非常有帮助。愚蠢的错误将 & 运算符放在 Xcode 的自动修复中,我并没有真正注意。感谢您的详尽解释!
【解决方案2】:

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

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

编辑如果您没有在插入时排序(我在 OP 中错过了),您可以按如下方式递归搜索 min:

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

【讨论】:

  • 谢谢,您和@CRD 提供了正确的答案,将 int * 更改为 int...愚蠢的错误....也感谢您的递归最小算法。我试试看!
  • 树已经按设计排序了,你不需要取左右子树中的最小值——OP的原始算法很好(最小值是最左边,最大值是最右边)。跨度>
  • @CRD,你是对的。由于问题格式,我错过了插入排序。现在会解决这个问题。
  • @danh 为我糟糕的格式道歉......仍然感谢帮助:)
猜你喜欢
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
相关资源
最近更新 更多