哎,来瞧瞧这颗二叉树!!!

terry_v 2011-07-08 11:19:08
二叉树的接口文件:

#ifndef BINARYTREE_H
#define BINARYTREE_H
#include <iostream>
template<class T>
struct BinTreeNode //二叉树节点类定义;
{
T data;
BinTreeNode<T> *leftChild, *rightChild;
BinTreeNode() : leftChild(NULL), rightChild(NULL) { }
BinTreeNode(T x, BinTreeNode<T> *l=NULL, BinTreeNode<T> *r=NULL) : \
data(x), leftChild(l), rightChild(r) { }
};
template<class T>
class BinaryTree //二叉树类的定义;
{
public:
BinaryTree() : root(NULL) { }
BinaryTree(T value) : RefValue(value), root(NULL) { }
BinaryTree(BinaryTree<T>& s);
~BinaryTree() {destroy(root);}
bool IsEmpty() const {return root==NULL;}
BinTreeNode<T> *Parent(BinTreeNode<T> *current) {return (root==NULL||root==current) ? NULL : Parent(root, current);}
BinTreeNode<T> *LeftChild(BinTreeNode<T> *current) {return (current!=NULL) ? current->leftChild : NULL;}
BinTreeNode<T> *RightChild(BinTreeNode<T> *current) {return (current!=NULL) ? current->rightChild : NULL;}
int Height() const {return Height(root);}
int Size() const {return Size(root);}
BinTreeNode<T> *getRoot() const {return root;}
void preOrder(void (*visit)(BinTreeNode<T> *p)) {preOrder(root, visit);} //前序遍历;
void inOrder(void (*visit)(BinTreeNode<T> *p)) {inOrder(root, visit);} //中序遍历;
void postOrder(void (*visit)(BinTreeNode<T> *p)) {postOrder(root, visit);} //后序遍历;
void levelOrder(void (*visit)(BinTreeNode<T> *p)); //层次序遍历;
int Insert(const T& item);
BinTreeNode<T> *Find(T& item) const; //搜索;
public:
friend std::istream& operator>>(std::istream& in, BinaryTree<T>& Tree);
friend std::ostream& operator<<(std::ostream& out, BinaryTree<T>& Tree);
private:
void CreateBinTree(std::istream& in, BinTreeNode<char> *subTree); //从文件读入建树;
bool Insert(BinTreeNode<T> *&subTree, const T& x); //插入;
void destroy(BinTreeNode<T> *subTree); //删除;
//bool Find(BinTreeNode<T> *subTree, const T& x) const;
BinTreeNode<T> *Copy(BinTreeNode<T> *orignode); //复制;
int Height(BinTreeNode<T> *subTree);
int Size(BinTreeNode<T> *subTree);
BinTreeNode<T> *Parent(BinTreeNode<T> *subTree, BinTreeNode<T> *current);
BinTreeNode<T> *Find(BinTreeNode<T> *subTree, const T& x) const; //搜寻x;
void Traverse(BinTreeNode<T> *subTree, std::ostream& out);
void preOrder(BinTreeNode<T> *subTree, void (*visit)(BinTreeNode<T> *p)); //前序遍历;
void inOrder(BinTreeNode<T> *subTree, void (*visit)(BinTreeNode<T> *p)); //中序遍历;
void postOrder(BinTreeNode<T> *subTree, void (*visit)(BinTreeNode<T> *p)); //后续遍历;
private:
BinTreeNode<T> *root;
T RefValue;
};
#endif


二叉树的实现文件:

#include "BinaryTree.h"
template<class T>
void BinaryTree<T>::destroy(BinTreeNode<T> *subTree)
{
if(subTree!=NULL)
{
destroy(subTree->leftChild);
destroy(subTree->rightChild);
delete subTree;
}
}
template<class T>
BinTreeNode<T> *BinaryTree<T>::Parent(BinTreeNode<T> *subTree, BinTreeNode<T> *current)
{
if(subTree==NULL) return NULL;
if(subTree->leftChild==current||subTree->rightChild==current)
return subTree;
BinTreeNode<T> *p;
if((p=Parent(subTree->leftChild, current))!=NULL)
return p;
else
return Parent(subTree->rightChild, current);
}
template<class T>
void BinaryTree<T>::Traverse(BinTreeNode<T> *subTree, std::ostream& out)
{
if(subTree!=NULL)
{
out<<subTree->data<<' ';
Traverse(subTree->leftChild, out);
Traverse(subTree->rightChild, out);
}
}
#include <stack>
void CreateBinTree(std::istream& in, BinTreeNode<char> *BT)
{
std::stack<BinTreeNode<char> *> s;
BT=NULL;
BinTreeNode<char> *p, *t;
int k;
char ch;
in>>ch;
while(ch!='#')
{
switch(ch)
{
case '(' : s.push(p); k=1; break;
case ')' : s.pop(); break;
case ',' : k=2; break;
default: p=new BinTreeNode<char>(ch);
if(BT==NULL) BT=p;
else if(k==1)
{
t=s.top(); t->leftChild=p;
}
else
{
t=s.top(); t->rightChild=p;
}
}
in>>ch;
}
}
template<class T>
std::istream& operator>>(std::istream& in, BinaryTree<T>& Tree)
{
Tree.CreateBinTree(in, root);
return in;
}
template<class T>
std::ostream& operator<<(std::ostream& out, BinaryTree<T>& Tree)
{
out<<"Output the tree:"<<'\n';
Tree.Traverse(root, out);
return out;
}
template<class T>
void BinaryTree<T>::preOrder(BinTreeNode<T> *subTree, void (*visit)(BinTreeNode<T> *p))
{
if(subTree!=NULL)
{
visit(subTree);
preOrder(subTree->leftChild, visit);
preOrder(subTree->rightChild, visit);
}
}
template<class T>
void BinaryTree<T>::inOrder(BinTreeNode<T> *subTree, void (*visit)(BinTreeNode<T> *p))
{
if(subTree!=NULL)
{
inOrder(subTree->leftChild, visit);
visit(subTree);
inOrder(subTree->rightChild, visit);
}
}
template<class T>
void BinaryTree<T>::postOrder(BinTreeNode<T> *subTree, void (*visit)(BinTreeNode<T> *p))
{
if(subTree!=NULL)
{
postOrder(subTree->leftChild, visit);
postOrder(subTree->rightChild, visit);
visit(subTree);
}
}


二叉树的应用文件:
#include "./ds_tree/BinaryTree.h"
#include "./ds_tree/BinaryTree.cpp"
using namespace std;
int main(int argc, char **argv)
{
BinaryTree<char> peiying;
cin>>peiying;
cout<<peiying<<endl;
system("pause");
return 0;
}


编译错误:
1>maincpp.obj : error LNK2005: "void __cdecl CreateBinTree(class std::basic_istream<char,struct std::char_traits<char> > &,struct BinTreeNode<char> *)" (?CreateBinTree@@YAXAAV?$basic_istream@DU?$char_traits@D@std@@@std@@PAU?$BinTreeNode@D@@@Z) 已经在 BinaryTree.obj 中定义
1>maincpp.obj : error LNK2001: 无法解析的外部符号 "class std::basic_istream<char,struct std::char_traits<char> > & __cdecl operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,class BinaryTree<char> &)" (??5@YAAAV?$basic_istream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$BinaryTree@D@@@Z)
1>maincpp.obj : error LNK2001: 无法解析的外部符号 "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class BinaryTree<char> &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$BinaryTree@D@@@Z)
1>E:\learn\c++ learn\Release\c++ learn.exe : fatal error LNK1120: 2 个无法解析的外部命令

高手帮我看看啊,我修改了一上午了,还是没修改正确。
...全文
194 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sivolin 2011-07-15
  • 打赏
  • 举报
回复
这种问题一般是你的某个成员函数忘记定义了,你找找看
旭子 2011-07-15
  • 打赏
  • 举报
回复
C++就是麻烦 模板是垃圾。。。
懒得打字 2011-07-08
  • 打赏
  • 举报
回复
额,不仅仅是上面的错误
CreateBinTree定义有问题

template<class T>
void BinaryTree::CreateBinTree<T>(std::istream& in, BinTreeNode<char> *BT)
懒得打字 2011-07-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]

再见模板的分离编译
[/Quote]

createbintree前面+template<class T>
pengzhixi 2011-07-08
  • 打赏
  • 举报
回复
自己看是否所有的函数都定义了,如果定义了得看函数名称,参数类型等等是否一致。
terry_v 2011-07-08
  • 打赏
  • 举报
回复
还是有一个错误:
1>maincpp.obj : error LNK2019: 无法解析的外部符号 "private: void __thiscall BinaryTree<char>::CreateBinTree(class std::basic_istream<char,struct std::char_traits<char> > &,struct BinTreeNode<char> *)" (?CreateBinTree@?$BinaryTree@D@@AAEXAAV?$basic_istream@DU?$char_traits@D@std@@@std@@PAU?$BinTreeNode@D@@@Z),该符号在函数 "class std::basic_istream<char,struct std::char_traits<char> > & __cdecl operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,class BinaryTree<char> &)" (??5@YAAAV?$basic_istream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$BinaryTree@D@@@Z) 中被引用
1>E:\learn\c++ learn\Debug\c++ learn.exe : fatal error LNK1120: 1 个无法解析的外部命令
terry_v 2011-07-08
  • 打赏
  • 举报
回复
我试试
就想叫yoko 2011-07-08
  • 打赏
  • 举报
回复
把定义也写在.h文件中
ryfdizuo 2011-07-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]
再见模板的分离编译
[/Quote]
呵呵。++
pengzhixi 2011-07-08
  • 打赏
  • 举报
回复
再见模板的分离编译
terry_v 2011-07-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lonelysky 的回复:]
额,不仅仅是上面的错误
CreateBinTree定义有问题

C/C++ code

template<class T>
void BinaryTree::CreateBinTree<T>(std::istream& in, BinTreeNode<char> *BT)
[/Quote]

悲剧了,我改不过来。

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧