c++:二叉树问题

这是关于二叉树的建立与前序算法。我的MAIN函数有问题不会改。请高手指教#include<iostream>usingnamespacestd;classBinTree;... 这是关于二叉树的建立与前序算法。我的MAIN函数有问题不会改。请高手指教
#include <iostream>
using namespace std;
class BinTree;
class BinTreeNode
{
friend class BinTree;
private:
char element;
BinTreeNode*left;
BinTreeNode*right;

public:
BinTreeNode(char data,BinTreeNode*lchild=0,BinTreeNode*rchild=0)
{
element=data;
left=lchild;
right=rchild;
}
};

class BinTree
{
private:
BinTreeNode*root;
public:
BinTree()
{
root=0;
}
BinTree(char data,BinTree<ree,BinTree&rtree)
{
root=new BinTreeNode(data,ltree.root,rtree.root);
ltree.root=0;
rtree.root=0;
}
void delTree(BinTreeNode*p) //指向当前根节点
{
if(p)
{
if(p->left)
delTree(p->left);
if(p->right)
delTree(p->right);
delete p;
}
}
~BinTree()
{
delTree(root);
}

void PreOrder(BinTreeNode*p)
{
if(p)
{
cout < <p->element;
PreOrder(p->left);
PreOrder(p->right);
}
}

};
void main()
{
BinTree S;
BinTree*root;
BinTree B('B');
BinTree D('D');
BinTree E('E');
BinTree C('C',D,E);
BinTree A('A',B,C);
S.PreOrder(root);

}

D:\Program Files\Microsoft Visual Studio\MyProjects\数据结构上机3\二叉树模板\二叉树.cpp(67) : error C2664: '__thiscall BinTree::BinTree(const class BinTree &)' : cannot convert parameter 1 from 'const char' to 'const class BinTree &'
Reason: cannot convert from 'const char' to 'const class BinTree'
No constructor could take the source type, or constructor overload resolution was ambiguous
D:\Program Files\Microsoft Visual Studio\MyProjects\数据结构上机3\二叉树模板\二叉树.cpp(68) : error C2664: '__thiscall BinTree::BinTree(const class BinTree &)' : cannot convert parameter 1 from 'const char' to 'const class BinTree &'
Reason: cannot convert from 'const char' to 'const class BinTree'
No constructor could take the source type, or constructor overload resolution was ambiguous
D:\Program Files\Microsoft Visual Studio\MyProjects\数据结构上机3\二叉树模板\二叉树.cpp(69) : error C2664: '__thiscall BinTree::BinTree(const class BinTree &)' : cannot convert parameter 1 from 'const char' to 'const class BinTree &'
Reason: cannot convert from 'const char' to 'const class BinTree'
No constructor could take the source type, or constructor overload resolution was ambiguous
D:\Program Files\Microsoft Visual Studio\MyProjects\数据结构上机3\二叉树模板\二叉树.cpp(72) : error C2664: 'PreOrder' : cannot convert parameter 1 from 'class BinTree *' to 'class BinTreeNode *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
执行 cl.exe 时出错.

二叉树模板.exe - 1 error(s), 0 warning(s)
请高手帮我看看到底哪里出错了。应该如何改正。
展开
 我来答
winds504
2008-11-30 · TA获得超过374个赞
知道小有建树答主
回答量:283
采纳率:100%
帮助的人:372万
展开全部
首先你类的成员函数有些问题:
1、BinTree带参数的构造函数
BinTree(char data,BinTree<ree,BinTree&rtree)
中间那段乱码应该是打错了,改为
BinTree(char data, BinTree<ree, BinTree&rtree)

2、PreOrder(BinTreeNode*p)函数中的那个cout后面的两个<,之间不应该有空格:
cout <<p->element;

下面看看主函数:
1、声明一个类的实例:BinTree B('B');
BinTree类没有只带一个参数的构造函数,可以新加一个只带一个参数的构造函数:
BinTree(char data)
{
root=new BinTreeNode(data,0,0);
}

2、S.PreOrder(root);
(1)S定义时,用的是不带参数的构造函数,那么S是空的,这里可以将S改为A
(2)root没赋值。这里函数参数的理想值应该是A.root,也就是A.PreOrder(A.root),但由于root是类的私有成员,不能这么用,可以这么改:
新加个不带参数的PreOrder()函数:
void PreOrder()
{
if(root)
{
cout <<root->element;
PreOrder(root->left);
PreOrder(root->right);
}
}
主函数调用时,改为A.PreOrder();

修改后的主函数如下:
void main()
{
BinTree B('B');
BinTree D('D');
BinTree E('E');
BinTree C('C',D,E);
BinTree A('A',B,C);
A.PreOrder();
}
xiaochaochina
2008-11-30 · TA获得超过324个赞
知道小有建树答主
回答量:115
采纳率:0%
帮助的人:84.4万
展开全部
我想这么难的问题在这里你是不太容易找到答案的!
建议你去c++专业论坛上看看去!

http://bbs.bc-cn.net/
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
仇曦韩华茂
2020-05-28 · TA获得超过3936个赞
知道大有可为答主
回答量:3128
采纳率:30%
帮助的人:279万
展开全部
...错误比较多
说说比较明显的:
1.二叉树先序遍历
void
preorder(tree
*t)//二叉树先序遍历
{
if(t)
{
cout<<t->data<<'
';
}
else
{
preorder(t->lchild);
preorder(t->rchild);
}
}
这个是遍历不起来的,先序遍历是先根再左右子树,这个顺序是必须的,不是你程序中写的if..else..的有条件的遍历。
2.用先序建立二叉树
我明白你程序中的意思是想用递归方式来由根到左右子树来构成一个二叉树,但是这样得到的树是不确定的;一般通过先序序列确定一个二叉树是需要一个中序序列的,只靠一个先序序列二叉树是不能确定的。
3.还要说说关于new的使用
在你用先序构建二叉树的方法中,参数是tree
*t,在其中
t=new
tree;
t->data=c;
你好像是在动态申请一个struct
tree类型的结构空间时,只对结构中的data域进行了赋值,而没有对左右孩子两个指针域赋值,而下面却以这两指针为参数递归调用左右孩子,虽然你的程序中没有发生访存错误,但是这种操作是很危险的,所以动态申请的时候要格外小心啊。
写程序就要多练,练后再看书时会发现书上的方法还真是好啊
我可以帮助你,你先设置我最佳答案后,我百度Hii教你。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式