从二叉搜索树问题中去除叶子

时间:2014-04-05 16:56:23

标签: c++ templates tree binary-tree

在过去的将来一周,我一直致力于这项被神弃绝的任务。它不再值得点了,我更感兴趣的是为了理解我自己的理智。无论如何,赋值是填充二叉搜索树,然后运行它删除所有叶子。驱动程序是为我们提供的(因此,我无法发布)。我几乎肯定我的问题在于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;
    } 
}

1 个答案:

答案 0 :(得分:0)

您的search()有一些问题。以

开头的行
else if (val < node->data)

将永远不会运行,因为它们之前的数量等于if (x) { ... } else if (!x) { ... },并且这两个测试中的一个肯定会成功,因此剩下的任何一个案例都不会触发。所以它永远不会真正递归!

另外,我不确定为什么在返回leaf(x)之前检查true。这意味着如果search()在树中作为内部节点false将返回val,这几乎肯定不是您想要的。