0

こんにちは、次のテンプレート コードは、「Computational Geometry and Computer Graphics in C++ by Michael J Laszlo」からのものです。

コード

#include <cstdlib>


template <class T> class SearchTree;



template<class T> class TreeNode{

private:
    TreeNode * _lchild;
    TreeNode * _rchild;
    T val;
public:
    TreeNode(T);
    virtual ~TreeNode(void);
    friend class SearchTree<T>;
    };

template <class T> TreeNode<T> :: TreeNode(T v) : val(v) , _lchild(NULL) , _rchild(NULL)
{}

template <class T> TreeNode <T> :: ~TreeNode(void)
{
if ( _lchild) delete _lchild;
if ( _rchild) delete _rchild;
}


//////////////////////////////////////////////////////////////////////////////////////
///////-------------------------------------------------------------------------------
//////////////////////////////////////////////////////////////////////////////////////
//////+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/////////////////////////////////////////////////////////////////////////////////////


template <class T> class SearchTree {

private:
    TreeNode <T> * root;
    int (*cmp) (T,T);
    void _inorder(TreeNode <T>*,void(*)(T));
public:
    SearchTree ( int (*) (T,T));
    ~SearchTree(void);
    int isEmpty(void);
    T find(T);
    T findMin(void);
    void inorder( void (*) (T));
    void insert(T);void remove(T);T removeMin(void);

};

template <class T>
SearchTree<T>::SearchTree(int(*c) (T,T)): cmp(c) ,root(NULL)
{} 

template <class T>
SearchTree<T>::~SearchTree()
{ if (root) delete root ;} 


template <class T> void SearchTree <T>::_inorder(TreeNode <T> *n ,void (*visit) (T))
{

if (n) {
_inorder(n->_lchild ,visit);
(*visit)(n->val);
_inorder(n->_rchild,visit);
};
}

template <class T> void SearchTree<T> :: inorder(void (*visit)(T)) {_inorder(root,visit);}

template <class T>
void SearchTree<T>::insert(T val)
{
if (root ==NULL) {

root =new TreeNode <T> (val);
return;
}

else{
int result;
TreeNode <T> * n, *p =root;
while (n) {
    p=n;
    result=(*cmp)(val,p->val);
    if (result <0) 
        {n = p->_lchild;}
    else if (result >0)
        { n= p->_rchild;}
    else 
        {return ;};
    }

    if (result <0) p->_lchild =new TreeNode <T> (val);
    else    p -> _rchild =new  TreeNode <T> (val);
}













}


template <class T>
T SearchTree <T> :: find ( T val) {
int result;
TreeNode <T> * n =root;
while (n) {
 result=(*cmp)(val,n->val);
 if (result >0) n =n->_rchild;
 else if (result <0 ) n=n->_lchild;
 else return n->val;


};
return 0;

}

上記コードの使い方

#include "treenode.h"
#include<iostream>

int compare(int x , int y)
{

if (x > y) {return 1;}
else if (x ==y) { return 0 ;}
else {return -1;};

};


void printer(int x) {std::cout <<x<<"\n";};
int main(){

SearchTree <int> jo(compare);jo.insert(9);
jo.insert(2);jo.insert(10);jo.insert(3);
jo.inorder(printer);
std::cout<<jo.find(10)<<std::endl;
return 0;

}

出力

3 9 0

質問

著者はどこで間違っているのですか?または私はそれを間違って実装していますか?

個人的には、以前に挿入された一部のメンバーを検索すると否定が返されるため、挿入関数の動作がおかしいと思います..

4

1 に答える 1