二叉树类,无法输出

时间:2022-05-10 17:30:39
编写了一个二叉树的程序,编译没有提示错误,但是却不给输出。为了方便热心人看,把一些其他成员函数都略去了。
希望能提供帮助,感激不尽!
这个是结点抽象类型

//BTreeNode.h

#ifndef BTREENODE_H
#define BTREENODE_H

#include <cstdlib>
template<class T> class BTree;

template<class T> class BTreeNode
{
friend class BTree<T>;
public:
BTreeNode():lchild(NULL),rchild(NULL){ };
BTreeNode(T&dt, BTreeNode<T> *lch =NULL , BTreeNode<T> *rch = NULL)
:data(dt),lchild(lch),rchild(rch){};

T get_data()const {return data; };
BTreeNode<T>* get_lchild()const {return lchild; };
BTreeNode<T>* get_rchild()const {return rchild; };

protected:
private:
T data;
BTreeNode<T> *lchild, *rchild;
};

#endif

//二叉树的抽象类型

//BTree.h
#ifndef BTREE_H
#define BTREE_H

#include "BTreeNode.h"
#include <iostream>
#include <cstdlib> //NULL的定义在这里

template <class T>
class BTree
{
friend std::ostream& operator <<(std::ostream&os, const BTree<T> bt);
public:
BTree(T *a,int m) 
{
n = m;
elems = new T[n];
elems = a;
//问题出在这里,没有这条语句时主函数中cout << bt ;还能输出正确结果,加上这条就不显示了,不知道哪里错了?
//root = build_body(0);加上这条语句不能显示
};

int get_n()const {return n; };
T* get_p()const{ return elems;};
protected:
private:
BTreeNode<T>* build_body(int i);

T *elems;
int n;
BTreeNode<T>* root;
};

template<class T>
std::ostream& operator <<(std::ostream&os, const BTree<T>& bt)
{
std::cout << "The tree is: " <<std::endl;
for(int i = 0; i != bt.get_n(); ++i)
std::cout << bt.get_p()[i];
std::cout << std::endl;

return os;
}

//构造子树
template <class T>
BTreeNode<T>* BTree<T>::build_body(int i)//suffix
{
BTreeNode<T> *p;
int l = 0, r = 0;
if( i < n && elems[i] != ' ')
{
 p = new BTreeNode<T>;
 p->data = elems[i];
 l = 2*i;
 r = 2*i + 1;
 p->lchild = build_body(l);
 p->rchild = build_body(r);
 return p;
}
else
return NULL;
}
#endif

测试函数

//MainFn.cpp

#include "BTree.h"
#include "BTreeNode.h"
#include <iostream>

using namespace std;

int main()
{
cout << 1 <<endl;
char *str = "12345 6";//字符数组的定义形式
BTree<char> bt(str,7);
cout << bt ; //不输出结果,为何??
//bt.inorder();
return 0;
}

6 个解决方案

#1


模板的声明跟定义都放在.h里,你分开编译没报错吗?
一般要用export关键字才能分开编译.

#2


我试了一下能输出的
输出为
1
this tree is
12345 6

#3



 BTree<char> bt(str,7);

p->lchild = build_body(l);
嵌套调用,结构不好,看不出有没有无限循环,跟踪调试吧!

#4


你可能看走眼了,我都是放在头文件里包含编译的

引用 1 楼 hairetz 的回复:
模板的声明跟定义都放在.h里,你分开编译没报错吗? 
一般要用export关键字才能分开编译.

#5


谢谢回答,我已经把有问题的那一句注释掉了,所以又结果。代码中说明了,那一句不注释掉的话没有结果

引用 2 楼 renshangyuan1988 的回复:
我试了一下能输出的 
输出为 

this tree is 
12345 6

#6


谢谢,很想知道问题出在哪里了,我不会跟踪调试,我去找找看这方面的资料吧

引用 3 楼 nullw 的回复:
BTree <char> bt(str,7); 

p->lchild = build_body(l); 
嵌套调用,结构不好,看不出有没有无限循环,跟踪调试吧!

#1


模板的声明跟定义都放在.h里,你分开编译没报错吗?
一般要用export关键字才能分开编译.

#2


我试了一下能输出的
输出为
1
this tree is
12345 6

#3



 BTree<char> bt(str,7);

p->lchild = build_body(l);
嵌套调用,结构不好,看不出有没有无限循环,跟踪调试吧!

#4


你可能看走眼了,我都是放在头文件里包含编译的

引用 1 楼 hairetz 的回复:
模板的声明跟定义都放在.h里,你分开编译没报错吗? 
一般要用export关键字才能分开编译.

#5


谢谢回答,我已经把有问题的那一句注释掉了,所以又结果。代码中说明了,那一句不注释掉的话没有结果

引用 2 楼 renshangyuan1988 的回复:
我试了一下能输出的 
输出为 

this tree is 
12345 6

#6


谢谢,很想知道问题出在哪里了,我不会跟踪调试,我去找找看这方面的资料吧

引用 3 楼 nullw 的回复:
BTree <char> bt(str,7); 

p->lchild = build_body(l); 
嵌套调用,结构不好,看不出有没有无限循环,跟踪调试吧!