我正在构建二进制搜索树;但该功能给细分错误。我不知道问题出在哪里。
在insertintree
中树无法建立零件无法正常工作,我已经尝试了方法,但无法正常工作
#include<bits/stdc++.h>
using namespace std;
struct node // structure of node
{
int k;
node* left = NULL;
node* right = NULL;
};
void insertintree(node* root, int key)
{
if (root == NULL)//root addition
{
node* root = new node;
root->k = key;
}
else
{
if (root->k < key) insertintree(root->right, key);
else insertintree(root->left, key);
}
}
void inorder(node* root)
{
if (root != NULL) {
inorder(root->left);
cout << root->k;
inorder(root->right);
}
}
int main()
{
node* root = NULL;
insertintree(root, 1);
cout << root->k;
}
答案 0 :(得分:3)
主要有两个问题:
您需要通过引用传递root
,否则,insertintree
将与您传递的root
的副本一起使用。
void insertintree(node* &root, int key)
// ^^^
{
}
其次,在第一个if
的正文中,您重新声明了一个新的root
Node
,这将遮盖传递的阴影。更改为
if (root == NULL)//root addition
{
root = new node;
root->k = key;
}
还要避免与#include<bits/stdc++.h>
和using namespace std;
一起练习:为什么?请参阅以下讨论:
答案 1 :(得分:2)
您的代码存在多个问题。首先是您重新声明migrate
。
root
这是两个不同的变量(即使它们具有相同的名称)。你应该写这个
void insertintree(node* root,int key) // root declared here
{
if(root==NULL)
{
node* root = new node; // root redeclared here
第二个问题是您期望void insertintree(node* root, int key) // root declared once
{
if(root==NULL)
{
root = new node; // now this is the root declared above
函数更改intsertintree
中声明的根,但不会。同样,仅仅因为两个变量具有相同的名称并不意味着它们是相同的变量。
main
更改void insertintree(node* root,int key) // a variable called root
{
...
}
int main()
{
node* root = NULL; // another variable called root
...
}
中的root
变量对insertintree
中名为root
的变量完全没有影响,它们是不同的变量。
要进行此项工作,您必须通过引用。当变量是引用时,对其进行更改会更改要引用的变量。像这样更改您的main
函数
insertintree
现在void insertintree(node*& root,int key)
// ^ this makes root a reference
{
是对root
中变量的引用,对其进行更改也会改变main
中的变量。
以同样的方式,当您像这样递归调用main
insertintree
insertintree(root->right,key);
函数将能够更改insertintree
,因为它需要对root->right
的引用。