使用struct在objective-c中创建二叉树

时间:2014-12-01 08:37:15

标签: objective-c tree binary-tree

我想在objective-c中创建一个带结构的二叉树,下面是我正在做的事情:

struct mytree{
    int value;
    struct mytree *parent;
    struct mytree *left;
    struct mytree *right;
};

- (void)insertmytree: (struct mytree *)root value:(int)value{
    struct mytree *temp;
      if (root == nil) {
         temp->value = value;
         temp->left = nil;
         temp->right = nil;
         root = temp;
      return;
      }

      if (value < root->value) {
         return [self insertmytree:root->left value:value];
      }else{
         return [self insertmytree:root->right value:value];
      }
}

生成树:

struct mytree t1;
t1.value = 10;
t1.parent = nil;
t1.left = nil;
t1.right = nil;

[self insertmytree:&t1 value:8];
[self insertmytree:&t1 value:3];
[self insertmytree:&t1 value:87];
[self insertmytree:&t1 value:45];
[self insertmytree:&t1 value:2];
[self insertmytree:&t1 value:4];
[self insertmytree:&t1 value:9];

它不起作用,请指出我正确的方向

2 个答案:

答案 0 :(得分:0)

我没有测试过,但这应该可行。

struct mytree{
    int value;
    struct mytree *parent;
    struct mytree *left;
    struct mytree *right;
};

- (void)insertmytree: (struct mytree *)root value:(int)value{
    struct mytree *temp = malloc(sizeof(struct mytree));
      if (root == nil) {
         temp->value = value;
         temp->left = nil;
         temp->right = nil;
         root = temp;
      return;
      }

      if (value < root->value) {
         return [self insertmytree:root->left value:value];
      }else{
         return [self insertmytree:root->right value:value];
      }
}

然后,当您从树中删除项目时,需要一些mekanism来清理动态分配的内存。

答案 1 :(得分:0)

在(Objective-)C(++)中,您必须显式分配您在堆上动态创建的任何对象/结构,只需声明一个类型为的变量指向对象/结构的指针不会分配对象/结构并将其引用存储在变量中。

例如:

NSMutableArray *myArray;

创建一个变量myArray,其类型为指向可变数组的指针NSMutableArray *。它不会创建数组。声明:

myArray = [NSMutableArray new];

分配一个新的可变数组并在myArray中存储对它的引用。

对于堆分配的C结构,您需要使用malloc(),它将对象/结构的大小作为参数,使用sizeof获得。

为你的例子做:

struct mytree *temp;

创建一个变量temp,它可以保存对struct mytree的引用,以及语句:

temp = (struct mytree *)malloc( sizeof(struct mytree) );

在堆上创建一个(未初始化的)struct mytree并在temp中存储对它的引用。

当您不再需要时,您还需要释放动态分配的内存。 E.g:

free(temp);

将释放temp引用的对象/结构,该对象/结构必须是使用malloc(或malloc系列中的其他函数)创建的对象/结构。注意:此语句更改temp中的值,因此在此调用之后temp中的值是对已释放内存的引用,如果temp仍在使用您可能希望为其分配NULL以避免意外访问已释放的内存。

HTH