#include<iostream>
using namespace std;
struct node{
int data;
node *left;
node *right;
node(int value = 0);
};
node::node(int value){
data = value;
left = NULL;
right = NULL;
}
class LinkedList{
public:
node *root;
LinkedList();
bool isEmpty();
void insertInto(int value, node *key);
};
LinkedList::LinkedList(){
root = NULL;
}
bool LinkedList::isEmpty(){
if(root == NULL) return true;
}
void LinkedList::insertInto(int value, node* root){
if (root == NULL)
{
node *n = new node(value);
root = n;
}
else if(value <= root->data){
insertInto(value, root->left);
}
else if(value > root->data){
insertInto(value,root->right);
}
}
int main() {
cout<<"I am gonna write the insertion of a binary tree"<<"\n";
LinkedList sample;
if(sample.isEmpty()) cout<<"THe tree is empty"<<endl; else cout<<"The tree is NOT empty"<<endl;
sample.insertInto(5,sample.root);
if(sample.isEmpty()) cout<<"THe tree is empty"<<endl; else cout<<"The tree is NOT empty"<<endl;
return 1;
}
我一直在研究这个问题已经有一段时间了,我似乎不明白为什么结果表明即使在添加值5之后树也是空的。另外请给出关于如何改进的提示。感谢
答案 0 :(得分:2)
忽略我对您发布的代码的样式/结构所做的评论:
void LinkedList::insertInto(int value, node* root){
if (root == NULL)
{
node *n = new node(value);
root = n;
}
您未在此处通过引用传递node* root
变量。相反,您需要将node* root
的副本更改为指向您构建的新node
对象。如果您希望此代码实际更改从main传入的sample.root
变量的值,则必须通过引用传递root
。
void LinkedList::insertInto(int value, node* &root){
因为LinkedList::insertInto
无论如何都是成员函数,为什么要传入root呢?
您可以访问成员变量root
,只需使用它即可。如果您仍然希望能够递归使用它,那么您可以使用该值创建一个公共函数,并将该调用作为私有版本,同时接受node*
是一个参数。
以下是一些编码风格的建议,因为您要求它们:
最佳编码练习要求您将类的成员变量设为私有,并使用公共成员函数来操作您的类。这是出于各种不同的原因。这里有一个解释:
https://softwareengineering.stackexchange.com/questions/143736/why-do-we-need-private-variables
所以你的课程(并让我们称之为BinaryTree
)会看起来像这样:
class BinaryTree{
public:
/* functions */
private:
node *root;
};
因此,不要让类的用户提供BinaryTree的根(因为我们无论如何都知道它没有意义),我们只是要求他们插入值,并自己提供root。
class BinaryTree{
public:
/* other functions */
void insertInto(int value);
private:
void insertInto(int value, node* &n);
node *root;
};
// Public version of the insertInto function
void insertInto(int value) {
insertInto(value, root);
}
// Private helper function for insertInto
void insertInto(int value, node* &n) {
if (n == NULL)
{
n = new node(value);
}
else if(value <= root->data){
insertInto(value, root->left);
}
else if(value > root->data){
insertInto(value,root->right);
}
}
int main() {
BinaryTree sample;
sample.insertInto(5);
}