二进制搜索树中的根节点为空

Root node in Binary search tree is null

本文关键字:根节点 搜索树 二进制      更新时间:2023-10-16

我正在学习C 和数据结构我已经实施了二进制搜索tress任何机构都可以告诉本代码中的问题吗我将根指针作为空指针。基本上无法创建树。我的最终目标是在树上搜索钥匙。我为此写了一种方法。但是不幸的是,我无法创建一棵树。我已经通过编写遍历代码进行了测试。

#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);
    }
}

根据我在插入节点代码中的主要问题,您是通过值呼叫而不是通过参考来传递aNode。而不是仅在插入节点函数中使用TreeNode *aNode,而是尝试使用TreeNode * &aNode

问题是您的insertNode函数会尝试创建一个新的TreeNode,如果您通过null,但这不会影响您传递的指针。

例如,

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
}

我认为,如果您现在尝试将其应用于您的示例,您会学到最好的。尝试确切了解为什么需要这样做。只需问您是否需要更多澄清。