如何在BST树中对数字的乘积收费?
How to charge product of numbers in BST tree?
我写了在BST树中收取产品编号的模板,但控制台在main中向我展示了任何问题。我不知道如何解决这个问题。我希望有人告诉我我哪里犯了错误。我认为该模板没问题,我在 main 中犯了任何错误,但我没有看到此错误。如果有人向我显示此错误,我将不胜感激。
#include <iostream>
using namespace std;
template<typename TData>
class BST {
public:
class BSTNode {
public:
BSTNode(const TData& d):left(NULL),right(NULL),data(d)
{};
BSTNode *left, *right;
TData data;
};
protected:
typedef BSTNode* PBSTNode;
PBSTNode root;
private:
bool Insert_tmp(PBSTNode &ptr,const TData &d);
void PreOrder_tmp(PBSTNode ptr)const;
void InOrder_tmp(PBSTNode ptr)const;
void PostOrder_tmp(PBSTNode ptr)const;
void DeleteTree(PBSTNode &ptr);
int Iloczyn(PBSTNode ptr);
public:
BST();
BST(const BST<TData>&); // aby zablokować konstruktor kopiujący nie implementujemy go
bool Insert(const TData& d);
void PreOrder()const;
void InOrder()const;
void PostOrder()const;
bool Delete(const TData& d);
int Iloczyn();
~BST();
};
template<typename TData>
BST<TData>::BST()
{
root=NULL;
}
template<typename TData>
bool BST<TData>::Insert(const TData& d)
{
return Insert_tmp(root,d);
}
template<typename TData>
void BST<TData>::PreOrder()const
{
if( root != NULL )
{
std::cout<<root->data<<", ";
PreOrder_tmp(root->left);
PreOrder_tmp(root->right);
std::cout<<std::endl;
}
}
template<typename TData>
void BST<TData>::InOrder()const
{
if( root != NULL )
{
InOrder_tmp(root->left);
std::cout<<root->data<<", ";
InOrder_tmp(root->right);
std::cout<<std::endl;
}
}
template<typename TData>
void BST<TData>::PostOrder()const
{
if( root != NULL )
{
PostOrder_tmp(root->left);
PostOrder_tmp(root->right);
std::cout<<root->data<<", ";
std::cout<<std::endl;
}
}
template<typename TData>
bool BST<TData>::Delete(const TData& d)
{
PBSTNode parent, //rodzic
del, //usuwany
rem; //zamienny
parent = NULL;
del=root;
while( del != NULL && del->data != d )
{
parent=del;
if( d < parent->data )
del=del->left;
else
del=del->right;
}
// czy jest d na drzewie
if( del == NULL )
return false;
// znaleziono element d
if( del->left == NULL && del->right == NULL ) // przypadek: lisc
{
if( parent != NULL )
{
if( parent->data > del->data )
parent->left=NULL;
else
parent->right=NULL;
}
else
root == NULL;
delete del;
}
else
{
if ( del->left == NULL || del->right == NULL ) // jedno poddrzewo
{
if( del->left == NULL )
rem = del->right;
else
rem = del->left;
*del=*rem;
}
else // są oba poddrzewa
{
parent = del;
rem = del->left;
while( rem->right != NULL )
{
parent = rem;
rem = rem->right;
}
del->data = rem->data;
if( parent == del )
parent->left = rem->left;
else
parent->right = rem->left;
}
delete rem;
}
return true;
}
template<typename TData>
BST<TData>::~BST()
{
if( root != NULL )
DeleteTree(root);
}
template<typename TData>
bool BST<TData>::Insert_tmp(PBSTNode &ptr,const TData &d)
{
if( ptr == NULL )
{
PBSTNode tmp;
try
{
tmp=new BSTNode(d); // jezeli nie bedzie miejsca w pamieci to wystai tu wyjatek
ptr=tmp;
return true;
}
catch(...)
{
return false;
}
}
if (d < ptr->data)
{
return Insert_tmp(ptr->left,d);
}
else if ( d > ptr->data )
{
return Insert_tmp(ptr->right,d);
}
else
{
return false; // gdy jest juz wartosc d w drzewie, w tej implementacji nie wstawiamy dwa razy tej samej wartosc
}
}
template<typename TData>
void BST<TData>::PreOrder_tmp(PBSTNode ptr)const
{
if( ptr != NULL )
{
std::cout<<ptr->data<<", ";
PreOrder_tmp(ptr->left);
PreOrder_tmp(ptr->right);
}
}
template<typename TData>
int BST<TData>::Iloczyn(PBSTNode ptr)
{
if(ptr==NULL)
return 1;
else
return (ptr->PBSTNode *Iloczyn(ptr->left)*Iloczyn(ptr->right));
}
template<typename TData>
void BST<TData>::InOrder_tmp(PBSTNode ptr)const
{
if( ptr != NULL )
{
InOrder_tmp(ptr->left);
std::cout<<ptr->data<<", ";
InOrder_tmp(ptr->right);
}
}
template<typename TData>
void BST<TData>::PostOrder_tmp(PBSTNode ptr)const
{
if( ptr != NULL )
{
PostOrder_tmp(ptr->left);
PostOrder_tmp(ptr->right);
std::cout<<ptr->data<<", ";
}
}
template<typename TData>
void BST<TData>::DeleteTree(PBSTNode &ptr)
{
if( ptr != NULL )
{
DeleteTree(ptr->left);
DeleteTree(ptr->right);
//cout<<"Del: "<<ptr->data<<", ";
delete ptr;
}
}
int main()
{
cout << "Drzewa BST" << endl;
BST<int> drzewo;
drzewo.Insert(5);
drzewo.Insert(-2);
drzewo.Insert(13);
drzewo.Insert(1);
drzewo.Insert(0);
drzewo.Insert(-2);
drzewo.Insert(14);
drzewo.PreOrder();
cout<<drzewo.Iloczyn();
return 0;
}
在BST
定义中,您已经声明了成员函数int Iloczyn();
但尚未实现它。
您需要添加以下内容:
template<typename TData>
int BST<TData>::Iloczyn() {
return 0; // or whatever int you'd like to return
}
但是,不应从此函数返回int
。节点类型TData
,因此应返回TData
。
Iloczyn()
中的乘法过程将始终返回1
,因为您永远不会在乘法中包含当前节点的数据值。
这些问题和许多其他问题在此演示中得到了纠正。
Ps. 不要typedef
指针类型。它只会使阅读变得困难。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何用数字处理log(0)
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 查找最接近的大于当前数字的数字的索引
- 找到两对数字,使它们的乘积的绝对差最小化
- 我想做一个彼此不同但重复出现的数字
- 如何在BST的这个简单递归实现中消除警告
- 将数字转换为字母(例如:123 转换为一二三)
- C++如何计算用户输入的数字中的偶数位数
- 如何在C++中确定文本文件中的元素是字符还是数字
- 打印数字图案
- C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
- 如何检查一个c++字符串中有多少相同的字符/数字
- 如何在BST树中对数字的乘积收费?
- 如何在BST中从最高到最低打印特定范围内的数字,访问的节点最少
- 在C++中将破折号删除的文件中的数字插入 BST