我在这里按照教程: http://cslibrary.stanford.edu/110/BinaryTrees.html
第一个问题是构造以下二叉树:
2
| \
1 3
我的问题是,为什么以下两个主要功能给出相同的结果。根据我的理解,在第二次调用insert函数之后的第二种情况下,root将指向子节点,即包含1的节点,因此它应该创建一个看起来像
的树。2
|
1
|
3
int main(void){
struct node* root = NULL;
struct node* n1;
struct node* n2;
root = insert(root, 2);
n1 = insert(root, 1);
n2 = insert(root, 3);
print(root);
return SUCCESS;
}
int main(void){
struct node* root = NULL;
struct node* n1;
struct node* n2;
root = insert(root, 2);
root = insert(root, 1);
root = insert(root, 3);
print(root);
return SUCCESS;
}
struct node* insert(struct node* node, int data){
if(node == NULL){return newnode(data);}
else{
if(data < node->data){node->left = insert(node->left, data);}
else{node->right = insert(node->right, data);}
return node;
}
}
答案 0 :(得分:1)
对于这些陈述
root = insert(root, 2);
root = insert(root, 1);
root = insert(root, 3);
从root
返回第一个非空节点指针后, insert
继续指向同一节点。
为了让您的期望成立,insert
必须被定义为
struct node* insert(struct node* node, int data){
if (node == NULL) {
return newnode(data);
} else {
if (data < node->data) {
return ( node->left = insert(node->left, data) );
} else {
return ( node->right = insert(node->right, data) );
}
}
}
但它没有这样定义。 (如果确实如此,那么这棵树将无法正常工作。)我认为这个功能比你想象的要简单。
每个节点指针仅返回一个级别。当您致电insert(root, ...)
时,返回值可以是newnode
或root
的返回值。
答案 1 :(得分:0)
如果要获取节点的左侧,则返回节点的左侧,而不是节点本身。 如果要获取节点的权限,则返回节点的右侧,而不是节点本身。