2
typedef struct _Tree{
    int val;
    struct _Tree *left;
    struct _Tree *right;
}Tree;

这里Tree有指针吗?它是否指向 val 的地址?

如果我定义这个怎么样Tree *node?是node指针指向的地址Tree吗?

如果我们想插入val,我们应该使用insert(&node)orinsert(node)吗?

void insert_Tree(Tree **root, int key){
if((*root) == NULL){
    (*root) = (Tree *)malloc(sizeof(Tree));
    (*root)->val = key;
    (*root)->left = NULL;
    (*root)->right = NULL;
    cout<<"insert data "<<key<<endl;
}else if(key< (*root)->val){
    insert_Tree(&(*root)->left, key);
    cout<<"go left"<<endl;
}else{
    insert_Tree(&(*root)->right, key);
    cout<<"go right"<<endl;
}
}
int main(){

Tree *root = NULL;
insert_Tree(&root, 10);
insert_Tree(&root, 20);
insert_Tree(&root, 5);
insert_Tree(&root, 100);
}
4

4 回答 4

5

Tree不是指针。它是用户定义类型的别名struct _Tree。所以当你声明一个新变量时,而不是输入

struct _Tree foo;

你可以简单地输入

Tree foo;

两者是等价的。

如果你声明

Tree *node;

C 中的一元运算*符是取消引用/间接运算符,因此您所说的是:*node或 , 的取消引用值node是 a Tree。或者换句话说,node是指向 a 的指针Tree,即指向 a 的指针struct _Tree

在您为其分配内存之前,此指针未初始化:

node = malloc (sizeof (Tree));

在分配此内存之前,指针指向某个未定义的位置。分配内存后,您可以val像这样插入节点:

node->val = val;

如何将它node本身插入二叉树是一个有趣的问题。你试过什么?

于 2013-08-31T23:19:16.180 回答
3

不,Tree根本不是指针或任何变量,它是 的typedef别名struct _Tree,并且可以与它互换使用。

如果您声明Tree *node,则您声明了一个指向Tree结构的指针,但没有实际的结构本身。

insert如果没有更多代码,很难说你的函数是如何工作的。

于 2013-08-31T22:56:36.963 回答
0

Tree是由您自己的代码定义的数据类型。注意你是如何在你的代码中调用它的,它和一个intdouble可能在同一个地方。

既然是数据类型,那么也可以定义为指针:

  Tree *root;

root是指向结构/数据类型“树”的指针。 root只有 4 个字节并且不分配Tree 结构。

或者 Tree 可以是一组结构化/格式化的存储位置:

 Tree  node;

node是结构树,并分配了实际的存储位置。如果您需要传递节点的地址,请指定:&node,这将创建一个指向“节点”存储位置的指针。

我认为您的其他问题取决于对Tree数据类型的理解。

一般来说,当你开始编程时,你不需要定义双指针,比如Tree **root,所以重新检查你的代码并简化它。

希望这可以帮助。

于 2013-09-01T01:58:09.467 回答
0

这是定义这个简单结构的更常用方法:

typedef struct{
    int val;
    Tree *left;
    Tree *right;
}Tree;

使用此结构通常如下所示:

Tree top;
Tree left;
Tree right;

top.val = 0;
top.left = &left;
top.right = &right;        

可以看到,这里的 Tree 不是指针,而是类型结构定义。它的作用类似于一个类型,这意味着您可以使用 Tree 类型实例化一个变量。此外,您需要使用参考符号 (&) 来分配左右树指针,因为结构成员(左右)是指向 Tree 的指针。

于 2013-08-31T23:18:06.053 回答