在过去的将来一周,我一直致力于这项被神弃绝的任务。它不再值得点了,我更感兴趣的是为了理解我自己的理智。无论如何,赋值是填充二叉搜索树,然后运行它删除所有叶子。驱动程序是为我们提供的(因此,我无法发布)。我几乎肯定我的问题在于search()和remove()的私有版本 - 尽管leaf()可能存在问题(我在那里遇到了一些seg错误)。我已尝试过无数种变化,但也许一些新鲜的眼睛可以提供帮助。我可能还应该提到这是一个继承的模板类;此外,Node类由左右指针和数据值组成。提前谢谢!
#include "binTree.h"
#ifndef prog6_binSTree_h
#define prog6_binSTree_h
template < class T >
class binSTree : public binTree < T > {
public:
void insert ( const T& );
bool search ( const T& ) const;
bool remove ( const T& );
private:
void insert ( Node < T >*&, const T& );
bool search ( Node < T >*, const T& ) const;
void remove ( Node < T >*&, const T& );
bool leaf ( Node < T >* node ) const;
};
#endif
template <class T>
void binSTree<T>::insert ( const T& x )
{
insert (this->root, x);
}
template <class T>
bool binSTree<T>::search ( const T& x ) const
{
return (search(this->root, x));
}
template <class T>
bool binSTree<T>::remove ( const T& x )
{
if (search (x))
{
remove (this->root, x);
return true;
}
else
return false;
}
template <class T>
void binSTree<T>::insert ( Node < T >*& node, const T& x)
{
if(node == nullptr)
node = new Node<T>(x);
else if (x < node->data)
insert (node->left, x);
else
insert (node->right, x);
}
template <class T>
bool binSTree<T>::search ( Node < T >* node, const T& val) const
{
if (node != nullptr)
{
if (leaf(node) && node->data == val)
return true;
else
return false;
}
else if (node == nullptr)
return false;
else if (val < node->data)
return search(node->left, val);
else
return search(node->right, val);
}
template <class T>
void binSTree<T>::remove ( Node < T >*& node, const T& x)
{
if(node->data == x && leaf(node))
{
delete node;
node = NULL;
}
else if (x < node->data)
remove (node->left, x);
else
remove (node->right, x);
}
template <class T>
bool binSTree<T>::leaf ( Node < T >* node ) const
{
if (node != nullptr)
{
if (node->left == nullptr && node->right == nullptr)
return true;
else
return false;
}
else
{
return false;
}
}
答案 0 :(得分:0)
您的search()
有一些问题。以
else if (val < node->data)
将永远不会运行,因为它们之前的数量等于if (x) { ... } else if (!x) { ... }
,并且这两个测试中的一个肯定会成功,因此剩下的任何一个案例都不会触发。所以它永远不会真正递归!
另外,我不确定为什么在返回leaf(x)
之前检查true
。这意味着如果search()
在树中作为内部节点,false
将返回val
,这几乎肯定不是您想要的。