理解二叉树

时间:2016-01-09 23:19:50

标签: c++ pointers

我是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指向树中的实际节点,因此我可以在其中添加新节点。

你能解释一下吗?

1 个答案:

答案 0 :(得分:2)

从Java迁移到C ++有点困难。从C ++迁移到Java同样很难。为了方便起见,您只需要进行实验。

在C ++中,指针是指向内存中另一个变量的位置的变量,而引用是指针,其语法行为类似于其地址所指向的变量。

当参数传递给函数时,函数会 NOT 接收原始参数,但会复制它们。您所做的工作是基于上述概念实现遍历。那么“神奇地”是如何工作的呢?

您的函数:getLeaf(Node *&temp, int value)搜索正确的叶节点并将其分配给要执行插入的temptemp这里是对指针temp的引用的副本(在operator <<中)。因此,当在temp中分配引用getLeaf时,其指向的temp中的指针operator <<会被修改。

  

如果我设置

     

Node *temp = root;
getLeaf(temp,value);
  在getLeaf函数中遍历树时,不会root被覆盖?

请注意,temproot是两个指向同一变量的不同指针。指针的内容是相同的,它们不是,因此当temp更新时,root被 NOT 覆盖。

但是后来代码中出现了问题。如果delete temp;root也将在插入结束时删除,因为delete会删除指针指向的内容。 NOT delete指针未由new分配。

提供一个单独的函数来释放树使用的动态分配的内存,并在完成实验时调用它。