【问题标题】:Root node in Binary search tree is null二叉搜索树中的根节点为空
【发布时间】:2014-03-10 16:48:18
【问题描述】:

我正在学习 C++ 和数据结构 我已经实现了二叉搜索树 任何人都可以说出这段代码中的问题吗 我将根指针设为空。 基本上无法创建树。 我的最终目标是搜索树中的键。我已经为它写了一个方法。但不幸的是,我无法创建一棵树。我已经通过编写遍历代码进行了测试。

#include <stdio.h>
#include <conio.h>
#include <iostream.h>

// Node structure
struct TreeNode {
    int value;
    int key;
    struct TreeNode *left;
    struct TreeNode *right;

   TreeNode()
    {
        left=NULL;
        right=NULL;
    }
};

void preOrder (TreeNode *);

void insertNode(TreeNode *, int, int);

TreeNode* findNode(TreeNode *aNode, int);

void main() {
    TreeNode *root = NULL;

    for(int i = 15; i<= 300; i+=15) {
        insertNode(root, i, i);

        if (root!=NULL) {
        cout<<root ->value<<endl;
        }
    }

    cout<<"The preorder traversal"<<endl;
    preOrder(root);

    getch();
}

void preOrder (TreeNode *p) {

    if (p!=NULL) {
        cout<<p ->value<<endl;
        preOrder(p ->left);
        preOrder(p ->right);
    }   else{
        cout << "NULL"<<endl;
    }
}

void createNewNode(TreeNode *newNode, int aValue, int aKey) {
    newNode = new TreeNode; // create new node
    newNode -> value = aValue; // set data
    newNode -> key = aKey; // set key
          cout<<newNode ->value<<endl;
    // Set left,right
    newNode -> left = newNode -> right = NULL;
}

void insertNode(TreeNode *aNode, int aValue, int aKey) {

    if (aNode == NULL) {
        TreeNode *newNode = new TreeNode; // create new node
        newNode -> value = aValue; // set data
        newNode -> key = aKey; // set key
        //createNewNode(newNode, aValue, aKey);

        if(newNode == NULL) {
            cout<< "Null returned"<<endl;
        } else {
             cout<< newNode -> key <<endl;
        }
        aNode = newNode;

    } else if (aKey == aNode->key) {
    cout<<aKey<<endl;
        return;

    } else if (aKey < aNode->key) {
          insertNode((aNode->left), aValue, aKey);

    } else {
        insertNode((aNode->right), aValue, aKey);
    }
}

TreeNode* findNode(TreeNode *aNode, int aKey) {

    if (aNode == NULL) {
        return NULL;
    } else if (aNode->key == aKey) {
         return aNode;
    } else if (aKey <= aNode->key) {
         return findNode(aNode->left, aKey);
    } else {
         return findNode(aNode->right, aKey);
    }
}

【问题讨论】:

    标签: c++ data-structures binary-search-tree recursive-datastructures


    【解决方案1】:

    根据我在插入节点代码中的主要问题,您通过按值调用而不是按引用调用传递aNode。不要在插入节点函数中只使用TreeNode *aNode,而是尝试使用TreeNode * &amp;aNode

    【讨论】:

    • 成功了。谢谢。但我不能放弃你的投票,因为我是新手。
    【解决方案2】:

    问题在于,如果您传入 NULL,您的 insertNode 函数会尝试创建一个新的 TreeNode,但这不会影响您传入的指针。

    例如,

    void foo(int * p) {
        p = new int;
    }
    
    int main() {
        int* test = NULL;
        foo(test);
        // test is still NULL, but foo created an int internally
    }
    

    您需要做的是将您的指针作为参考传递,以便foo 将修改您提供给它的指针(而不仅仅是创建一个)。像这样:

    void foo(int *& p) { // Notice I'm now using a reference to a pointer
        p = new int;
    }
    
    int main() {
        int* test = NULL;
        foo(test);
        // test will now point to whatever foo created
    }
    

    我认为,如果您现在尝试将此应用到您的示例中,您会学得最好。尝试准确理解为什么需要这样做。只需询问您是否需要更多说明。

    【讨论】:

    • 感谢您的解释。它真的帮助我清除了我的概念
    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多