typedef struct _Tree{
int val;
struct _Tree *left;
struct _Tree *right;
}Tree;
这里是Tree
指针吗?它是否指向val的地址?
如果我定义Tree *node
怎么样?
node
指针指向Tree
的地址吗?
如果我们要插入val
,我们应该使用insert(&node)
还是insert(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);
}
答案 0 :(得分:5)
Tree
不是指针。它是用户定义类型struct _Tree
的别名。因此,当您声明一个新变量时,而不是键入
struct _Tree foo;
您只需输入
即可Tree foo;
这两个是等价的。
如果您声明
Tree *node;
C中的一元*
运算符是取消引用/间接运算符,因此您所说的是:*node
或node
的解除引用值,是{{1 }}。或者换句话说,Tree
是指向node
的指针,即指向Tree
的指针。
在您为其分配内存之前,此指针未初始化:
struct _Tree
在分配此内存之前,指针指向某个未定义的位置。分配内存后,您可以将node = malloc (sizeof (Tree));
插入节点,如下所示:
val
如何将此node->val = val;
本身插入二叉树是一个有趣的问题。你有什么尝试?
答案 1 :(得分:3)
不,Tree
根本不是指针或任何变量,它是typedef
的{{1}}别名,可以与之互换使用。
如果您声明struct _Tree
,则您已声明指向Tree *node
结构的指针,但本身没有实际结构。
如果没有更多代码,您Tree
函数的工作原理很难说。
答案 2 :(得分: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类型实例化一个变量。此外,您需要使用引用符号(&amp;)来分配左右树指针,因为结构成员(左侧和右侧)是指向Tree的指针。
答案 3 :(得分:0)
Tree
是由您自己的代码定义的数据类型。请注意您在代码中如何调用它,它与int
或double
可能位于同一位置。
由于它是一种数据类型,因此您也可以将其定义为指针:
Tree *root;
root
是指向结构/数据类型“Tree”的指针。 root
只有4个字节,不分配树结构。
Or Tree可以是一组结构化/格式化的存储位置:
Tree node;
node
是结构树,并分配了实际的存储位置。如果需要传递节点的地址,请指定:&node
,这会在“节点”处创建指向存储位置的指针。
我认为您的其他问题取决于对Tree
数据类型的理解。
通常,当您从编程开始时,您不需要定义双指针,例如Tree **root
,因此请重新检查您的代码并简化它。
希望这有帮助。