当前位置: 首页 > 知识库问答 >
问题:

在Objective-C中打印二叉搜索树时获得了EXC_BAD_访问权限

子车峰
2023-03-14

我在打印二进制搜索树时遇到堆栈溢出(线程1:EXC_BAD_ACCESS(代码=2,地址=0x7ffeef3ffff8))。经过一些检查,在启动inOrderTraversalRecursive方法之前,树的根似乎变为零。不知道为什么根变为零。我知道这一点和这些资源,但到目前为止他们没有帮助我。感谢您抽出时间回答我的问题。

在main. m文件中

#import <Foundation/Foundation.h>

@interface BSTNode : NSObject
@property (nonatomic, assign) int data;
@property (nonatomic, strong) BSTNode *left;
@property (nonatomic, strong) BSTNode *right;
@end

@implementation BSTNode
@end

@interface BST: NSObject

@property (nonatomic,strong) BSTNode *root;

- (void)insertNode:(int)value;
-(void)inOrderTraversal;
@end

@implementation BST

-(instancetype)init{
    if (self = [super init]) {
        self.root = [self initializeTreeNode];
    }
    return self;
}

- (BSTNode *)initializeTreeNode {
    // By default, |data| is 0, |left| is nil, |right| is nil
    return [[BSTNode alloc] init];
}

- (void)insertNode:(int)value {
    self.root = [self insertNode:_root withData:value];
}

- (BSTNode *)insertNode:(BSTNode *)root withData:(int)data {
    if(!root) {
        root = [self initializeTreeNode];
        root.data = data;
    } else if (root.data >= data) {
        root.left = [self insertNode:root.left withData:data];
    } else {
        root.right = [self insertNode:root.right withData:data];
    }

    return root;
}

-(void)inOrderTraversal {
    [self inOrderTraversalRecursive:self.root];
}

-(void)inOrderTraversalRecursive:(BSTNode *)root {
    // inOrder = left - root - right
    [self inOrderTraversalRecursive:root.left];
    NSLog(@"%d",root.data);
    [self inOrderTraversalRecursive:root.right];
}

@end

在主楼里面。M

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        BST *bst = [BST new];
        [bst insertNode:50];
        [bst insertNode:30];
        [bst insertNode:20];
        [bst insertNode:40];
        [bst insertNode:70];
        [bst insertNode:60];
        [bst insertNode:80];
        [bst inOrderTraversal];
    }
    return 0;
}

附言

我基于geeksforgeeks java实现BST设计了BST和BSTNode类。Objective-C中BST(插入、查找、打印、删除)的正确实现是什么?似乎找不到任何地方。

共有2个答案

艾凯捷
2023-03-14

我错过了遍历函数中的nil检查。

-(void)inOrderTraversalRecursive:(BSTNode *)root {
    if (!root) {
        return;
    }
    [self inOrderTraversalRecursive:root.left];
    NSLog(@"%d",root.data);
    [self inOrderTraversalRecursive:root.right];
}
洪璞瑜
2023-03-14

(线程1:EXC_BAD_ACCESS(代码=2,地址=0x7FFEF3FFFF8))表示您正在访问已经释放的内存块。这意味着您的对象已从内存中释放,您无法再访问它。这就是为什么访问不好。

此外,这可能意味着您正持有指向不再存在的内存地址的悬空指针。

 类似资料:
  • 下面是一个二叉查找树,它有一个根节点、一个左节点和一个右节点。代码有效,但我想显示这个二叉查找树,这样我就可以看到图层中的每个节点…这是代码…

  • 我想以这种格式打印二叉查找树: 我想我必须获得树的深度,然后,对于每个级别,在每个元素前后打印一些空格。 我不知道如何继续。 节点类:

  • //执行顺序遍历的递归方法

  • 我正在学习C++语言,我正在尝试编写BST,但是出了问题。我尝试添加元素到空树,根是NULL,但添加元素后,根仍然是NULL,尽管添加成功了(我在调试模式下看到,节点设置为tmp)。我不知道为什么会这样。

  • 在“二叉树”中,一个外部节点是一个没有任何子节点的节点,无论是左的还是右的,如果我错了,请纠正我-在“二叉树”中,一个外部节点总是空的,因为根据我的课堂讲稿,一个内部节点总是有两个子节点,即使没有创建,但我们假设该内部节点的子节点是空的。那么,如果外部节点为空,我如何访问它呢? 我将这段代码作为BST节点类的一部分编写: Last方法给我nullPointerException

  • 我刚刚开始学习Haskell,我正在尝试编写一个代码来搜索二叉树中的特定值,如果当前返回true,否则返回false这就是我的树结构的样子 我不确定如何继续遍历树并返回值的函数。我确实尝试了BFS和DFS,但我不确定一旦得到值后如何返回。 我的函数应该是什么样子的一个例子