我已经为BST编写了一个节点插入代码。但是它似乎无法正常工作。它给出了“细分错误”。这是我的插入逻辑。
char a = ' ';
int m = a* 10;
System.out.println(m);
我该如何解决?谢谢
编辑:所以我尝试了一些方法,而这个就可以了
void insert(Node* root, int data){
if(root==NULL){
root= new Node;
root->data = data;
}
else if(data < root->data){
insert(root->left,data);
}
else if(data> root->data){
insert(root->right,data);
}
}
Node * root和Node *&root有什么区别?
答案 0 :(得分:1)
好吧,如果节点不存在(它是NULL
),那么您只是将root
的指针设置为new Node
,但是却缺少“挂断”的功能给它的父母如前所述,自unique_ptr
起,您可以使用C++11
-s来避免内存泄漏(那是您忘记删除对象的时候)。看起来像:
struct Node {
int data = -1; // not initialized
std::unique_ptr<Node> l;
std::unique_ptr<Node> r;
}
void insert(Node *root, int data) {
if (root->data == -1) {
root->data = data;
return;
}
if (data < root->data) {
if (!root->l) {
// hanging new left node up
root->l = std::make_unique<Node>(); // std::make_unique comes since C++14
}
insert(root->l.get(), // getting raw ptr
data);
}
else {
if (!root->r) {
// hanging new right node up
root->r = std::make_unique<Node>();
}
insert(root->r.get(), data);
}
}
此外,您可能会对称为treap的数据结构感兴趣,因为如果您插入例如增加序列号,则您的实现可能会花费很长时间:
Node root;
for (int i = 1; i <= 100'000; i++) {
insert(&root, i);
}
所以在这种情况下,您的二叉树看起来像:
1
\
2 <=
\ <= very long path
3 <=
\
...
\
100'000
重击有助于避免BST中的路径过长。