二进制搜索树中的根节点为空
Root node in Binary search tree is null
我正在学习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
}
我认为,如果您现在尝试将其应用于您的示例,您会学到最好的。尝试确切了解为什么需要这样做。只需问您是否需要更多澄清。
相关文章:
- 有根的二进制搜索树.保留与其父级的链接
- C++二叉搜索树模板从函数返回节点
- 二叉搜索树使用最常用的节点来打印出某些语句
- 返回二叉搜索树特定级别的节点数的函数
- 无法打印完整的二叉搜索树,因为我从最低节点向后迭代的逻辑有缺陷
- 使用二进制搜索树中的迭代器对象访问左侧节点
- C++ Eclipse:二叉搜索树节点>数据=变量似乎不起作用
- 删除节点方法实际上不会删除二叉搜索树中的节点.C++
- 在C++中实现二叉搜索树,搜索不起作用.尝试打印节点的元素会导致输出崩溃
- 二叉搜索树按级别递归C++打印节点
- 插入到二叉搜索树中.节点替换
- 如何替换二叉搜索树中的节点
- C++ 从二叉搜索树中删除具有两个子节点的特定节点
- 检查节点是否是二进制搜索树的根
- 为什么我的原始二叉搜索树被修改,即使我在另一个节点中复制了根节点
- 二进制搜索树中的根节点为空
- 二叉搜索树,如何将节点连接到根
- 递归函数插入二叉搜索树无法按根访问节点
- 二叉搜索树插入c++根在当前节点
- 删除二叉搜索树的根节点