簡體   English   中英

二進制搜索樹中的根節點為空

[英]Root node in Binary search tree is null

我正在學習已經實現了二進制搜索樹的c ++和數據結構,任何機構都可以知道此代碼中的問題是什么,我正在將root指針設置為null。 基本上無法創建樹。 我的最終目標是在樹中搜索密鑰。 我已經寫了一個方法。 但是很遺憾,我無法創建樹。 我已經通過編寫遍歷代碼對其進行了測試。

#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

問題是,如果您傳入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
}

我認為,如果您現在嘗試將其應用於您的示例,您將學得最好。 試着確切地理解為什么需要這樣做。 只是問您是否需要更多說明。

暫無
暫無

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

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