二叉树根为空
Binary Tree root is null
我正在尝试创建一个二叉搜索树,但它似乎不起作用。我调试了它,它说根是空的。我不明白为什么它为空。我最初在构造函数中将它设置为 null,但是当我调用 insert() 方法时,它不再是 null,对吗?有人可以帮助我理解这一点。谢谢
#include "stdafx.h"
#include <iostream>
using namespace std;
struct node
{
public:
int value;
node * left;
node * right;
};
class bTree
{
public:
node * root;
public:
bTree();
void insert(node * r, int val);
void insert(int val);
void traversePreorder();
void traversePreorder(node * r);
};
bTree::bTree()
{
root = NULL;
}
void bTree::insert(node * r, int val)
{
if (r == NULL)
{
r = new node();
r->value = val;
r->left = NULL;
r->right = NULL;
return;
}
else
{
if (val <= r->value)
{
insert(r->left, val);
}
else
{
insert(r->right, val);
}
}
}
void bTree::insert(int val)
{
insert(root, val);
}
void bTree::traversePreorder(node * r)
{
if (root == nullptr)
return;
else
{
cout << root->value << " ";
traversePreorder(root->left);
traversePreorder(root->right);
}
}
void bTree::traversePreorder()
{
traversePreorder(root);
}
int main()
{
bTree * myTree = new bTree();
myTree->insert(30);
myTree->insert(40);
myTree->insert(20);
myTree->insert(10);
myTree->insert(50);
myTree->traversePreorder();
return 0;
}
如果调试 void bTree::insert(node * r, int val)
,您会发现 root
根本没有改变。
在void bTree::insert(node * r, int val)
中,r
是按值传递的,所以r
在函数内部的变化(new
等)与外部变量无关(root
)。您可以将其更改为通过引用传递:
void bTree::insert(node *& r, int val)
见What's the difference between passing by reference vs. passing by value?
How to pass objects to functions in C++?
顺便说一句:在 void bTree::traversePreorder(node * r)
中,你应该使用 r
,而不是 root
:
void bTree::traversePreorder(node * r)
{
if (r == nullptr)
return;
else
{
cout << r->value << " ";
traversePreorder(r->left);
traversePreorder(r->right);
}
}
我正在尝试创建一个二叉搜索树,但它似乎不起作用。我调试了它,它说根是空的。我不明白为什么它为空。我最初在构造函数中将它设置为 null,但是当我调用 insert() 方法时,它不再是 null,对吗?有人可以帮助我理解这一点。谢谢
#include "stdafx.h"
#include <iostream>
using namespace std;
struct node
{
public:
int value;
node * left;
node * right;
};
class bTree
{
public:
node * root;
public:
bTree();
void insert(node * r, int val);
void insert(int val);
void traversePreorder();
void traversePreorder(node * r);
};
bTree::bTree()
{
root = NULL;
}
void bTree::insert(node * r, int val)
{
if (r == NULL)
{
r = new node();
r->value = val;
r->left = NULL;
r->right = NULL;
return;
}
else
{
if (val <= r->value)
{
insert(r->left, val);
}
else
{
insert(r->right, val);
}
}
}
void bTree::insert(int val)
{
insert(root, val);
}
void bTree::traversePreorder(node * r)
{
if (root == nullptr)
return;
else
{
cout << root->value << " ";
traversePreorder(root->left);
traversePreorder(root->right);
}
}
void bTree::traversePreorder()
{
traversePreorder(root);
}
int main()
{
bTree * myTree = new bTree();
myTree->insert(30);
myTree->insert(40);
myTree->insert(20);
myTree->insert(10);
myTree->insert(50);
myTree->traversePreorder();
return 0;
}
如果调试 void bTree::insert(node * r, int val)
,您会发现 root
根本没有改变。
在void bTree::insert(node * r, int val)
中,r
是按值传递的,所以r
在函数内部的变化(new
等)与外部变量无关(root
)。您可以将其更改为通过引用传递:
void bTree::insert(node *& r, int val)
见What's the difference between passing by reference vs. passing by value?
How to pass objects to functions in C++?
顺便说一句:在 void bTree::traversePreorder(node * r)
中,你应该使用 r
,而不是 root
:
void bTree::traversePreorder(node * r)
{
if (r == nullptr)
return;
else
{
cout << r->value << " ";
traversePreorder(r->left);
traversePreorder(r->right);
}
}