我是C ++的新手,我通常使用Java,因此我很难进入指针和参考。我必须对内部节点和叶节点进行二叉搜索树的变体(只有叶子包含数据)。
class Node
Node *parent;
Node *left;
Node *right;
//other stuff
}
我需要实现operator<<
,它会为树添加一个带有值的新节点。
//adding a node to tree
void operator<<(int value){
if(size == 0){
//stuff
} else {
Node* temp = root;
getLeaf(temp,value);
//other magic
//temp will be used to append a new node into tree,
//so it has to point to the actual node in the tree
delete temp;
}
}
功能点getLeaf
是找到一个叶子(可能包含或不包含所需的value
)并将其存储到temp
中,需要在{operator<<
中访问它1}}功能。
int getLeaf( Node* temp, int value) const{
int depth = 0;
//goes trough all inner nodes until it finds specific leaf
while(temp->isInner()){
++depth;
if(value < temp->getValue()){ //searched value is smaller
temp = temp->getLeft(); // to left subtree
continue;
} else {
temp = temp->getRight(); //to rightsubtree
continue;
}
return depth;
}
我真的很困惑如何做到这一点以及指针和值的正确组合。如果我设置
Node* temp = root;
getLeaf(temp,value);
在遍历getLeaf
函数中的树时,不会覆盖根目录?
另外,我需要temp
指向树中的实际节点,因此我可以在其中添加新节点。
你能解释一下吗?
答案 0 :(得分:2)
从Java迁移到C ++有点困难。从C ++迁移到Java同样很难。为了方便起见,您只需要进行实验。
在C ++中,指针是指向内存中另一个变量的位置的变量,而引用是指针,其语法行为类似于其地址所指向的变量。
当参数传递给函数时,函数会 NOT 接收原始参数,但会复制它们。您所做的工作是基于上述概念实现遍历。那么“神奇地”是如何工作的呢?
您的函数:getLeaf(Node *&temp, int value)
搜索正确的叶节点并将其分配给要执行插入的temp
。 temp
这里是对指针temp
的引用的副本(在operator <<
中)。因此,当在temp
中分配引用getLeaf
时,其指向的temp
中的指针operator <<
会被修改。
如果我设置
在getLeaf函数中遍历树时,不会root被覆盖?Node *temp = root; getLeaf(temp,value);
请注意,temp
和root
是两个指向同一变量的不同指针。指针的内容是相同的,它们不是,因此当temp更新时,root被 NOT 覆盖。
但是后来代码中出现了问题。如果delete temp;
,root
也将在插入结束时删除,因为delete
会删除指针指向的内容。 NOT delete
指针未由new
分配。
提供一个单独的函数来释放树使用的动态分配的内存,并在完成实验时调用它。