【发布时间】:2020-11-06 20:55:22
【问题描述】:
我在二叉搜索树中编写了一个搜索功能。虽然该功能正常工作并且当键存在于树中时执行它应该执行的操作,但当它不存在时会给出分段错误。打印“是”或“否”是否正确,或者该函数是否应该返回指向节点的指针?
template<class T>
class Node{
public:
T m_data;
Node<T>* m_left;
Node<T>* m_right;
Node(T data){
m_data=data;
m_left=nullptr;
m_right=nullptr;
}
};
template<class T>
class bst {
private:
Node<T>* root;
public:
bst() { root = nullptr; }
~bst() { deltree(root); }
void addnode(Node<T>* node, T data) {
if(this->root == nullptr) {
Node<T>* new_node= new Node<T>(data);
this->root = new_node;
} else if(data > node->m_data) {
if(node->m_right != nullptr) {
addnode(node->m_right, data);
} else {
Node<T>* new_node = new Node<T>(data);
node->m_right = new_node;
}
} else if(data < node->m_data) {
if(node->m_left != nullptr) {
addnode(node->m_left, data);
} else {
Node<T>* new_node = new Node<T>(data);
node->m_left = new_node;
}
}
}
void addnode(T data) { addnode(this->root, data); }
void searchkey(T data) { searchkey(data, this->root); }
void searchkey(T data, Node<T>* node) {
if(this->root == nullptr) {
std::cout << "Empty :) ";
}
if(data == node->m_data) {
std::cout << "Found";
} else if(node->m_data > data) {
searchkey(data, node->m_left);
} else if(node->m_data < data) {
searchkey(data, node->m_right);
}
else {
std::cout << "NOt fOUND";
}
}
void deltree(Node<T>* node) {
if(node) {
deltree(node->m_left);
deltree(node->m_right);
delete node;
}
};
【问题讨论】:
-
无关:我真的希望在
bst类中看到析构函数。 -
请注意,您在
void addnode(Node<T>* node, T data);中存在严重问题 - 您递归地创建新的Nodes。您应该仅在找到数据槽时创建它,否则您会创建大量泄漏的Nodes。你还需要一个析构函数。 example -
好的,我会处理的。感谢您指出! @TedLyngmo
-
@TedLyngmo 我已经尝试解决这两个问题。
标签: c++ search binary-search-tree