簡體   English   中英

將節點添加到二進制搜索樹

[英]Add node to binary search tree

以下代碼應將節點添加到我的BST結構中,但未這樣做。 新節點根本不會附加到樹,包括根節點。 誰能指出問題出在哪里?

樹的構造函數:

template <typename K, typename T>
MyBinaryTree<K, T>::MyBinaryTree() {
    root = nullptr;
}

從外部調用的函數:

    template <typename K, typename T>
void MyBinaryTree<K, T>::addValue(K key, T value) {
    Node *node = new Node(key, value);
    addToSubtree(root, node);
}

和必須附加節點的內部私有函數:

    template <typename K, typename T>
void MyBinaryTree<K, T>::addToSubtree(MyBinaryTree<K, T>::Node *node,
            MyBinaryTree<K, T>::Node *toAdd) {
    if(node == nullptr) {
        node = toAdd;
    } else {
        if(toAdd->key > node->key) addToSubtree(node->right, toAdd);
        else if(toAdd->key < node->key) addToSubtree(node->left, toAdd);
    }
}

您應該使用如下引用: MyBinaryTree<K, T>::Node *&root

由於您在addToSubtree修改root時,它僅修改本地函數參數root,root參數的副本,而不修改root參數本身。

您的node變量是一個包含指向Node指針的局部變量,當您為它分配一個值時,它僅適用於函數范圍內的該局部變量。

為了使您的函數正常工作,您應該使node變量的指針指向指針(這樣就可以像addToSubtree(&node->right, toAdd)或指向指針的引用那樣addToSubtree(&node->right, toAdd)addToSubtree(&node->right, toAdd)

您的代碼有兩個問題:

  1. 盡管它應該代表面向對象的thinkig,但是代碼可以回溯到C風格的服務中。 root元素不應作為參數傳遞。 由於它是成員變量,因此它在每個成員函數作用域中都存在automaticallty。

這個 :

   template <typename K, typename T>
void MyBinaryTree<K, T>::addToSubtree(MyBinaryTree<K, T>::Node *root,
            MyBinaryTree<K, T>::Node *toAdd) {
   //rest...
}

應該是這樣的:

   template <typename K, typename T>
void MyBinaryTree<K, T>::addToSubtree( MyBinaryTree<K, T>::Node *toAdd) {
    if(root == nullptr) {
        root = toAdd;
    } //rest...
}

該函數已經知道什么是root ,因為root是成員變量。 成員函數可以更改成員變量,而無需將其傳遞給函數

  1. 真正的問題是指針指針之間的區別。 每當我們希望函數更改給定的參數之一時,該參數都應作為指針或引用傳遞。

如果參數已經是指針,則為了更改指針本身,應將其作為指針傳遞給指針或作為指針傳遞給參照

因此,假設我們確實希望繼續將root作為參數傳遞(我們不希望這樣做),我們應該將它作為

void MyBinaryTree<K, T>::addToSubtree(MyBinaryTree<K, T>::Node **root,
            MyBinaryTree<K, T>::Node *toAdd) {
    if(*root == nullptr) {
        *root = toAdd;
        //rest

要么作為

void MyBinaryTree<K, T>::addToSubtree(MyBinaryTree<K, T>::Node*& root,
            MyBinaryTree<K, T>::Node *toAdd) {
    if(root == nullptr) {
        root = toAdd;
       //the rest...

第二個是更多的C ++樣式,第一個是更多的C樣式,但是兩者都是有效的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM