用c++写了一个二叉树模板,但是建立CreateBiTree这块总出现问题。
单步调试了下出现:
单步调试了下出现:
template <typename T>
struct BiTnode //树的链式存储结构,表式树的一个结点,一个数据域,两个指针域
{
T element;
BiTnode<T> * lchild, *rchild;
};
template <typename T>
struct BiTNodePost //非递归后序遍历结构
{
BiTnode<T> * biTree;
char tag;
};
using namespace std;
template<typename T>
class BiTree
{
public:
BiTree() { root = NULL; Treesize = 0; }
~BiTree() { erase(root); }
void CreateBiTree(BiTnode <T>*node);
void erase(BiTnode<T> *node);
bool empty() const{ return Treesize == 0; }
int size() const{ return Treesize; }
//递归遍历方法
void preOrder(BiTnode <T>*node);
void inOrder(BiTnode <T>*node);
void postOrder(BiTnode <T>*node);
//非递归遍历方法
void preOrderstack(BiTnode<T> *node);
void inOrderstack(BiTnode <T>*node);
void postOrderstack(BiTnode<T> *node);
void levelOrderqueue(BiTnode<T> *node);
//遍历时对每个节点的操作
void operator_(BiTnode<T> *node);
//深度
int Treedepth(BiTnode <T>*node) const;
//访问根结点
BiTnode<T> * Root(){ return root; }
private:
BiTnode <T>*root;
int Treesize;
};
template<typename T>
void BiTree<T>::CreateBiTree(BiTnode <T>* node)
{
T e;
cin >> e;
if (e == "#")
node = NULL; //保证是叶结点
else
{
node = new BiTnode<T>;
node->element = e;//生成结点
Treesize++;
CreateBiTree(node->lchild);//构造左子树
CreateBiTree(node->rchild);//构造右子树
}
}
运行程序是
int main()
{
cout << "创建一颗二叉树:" << endl;
BiTree<char> tree;
tree.CreateBiTree(tree.Root());
cout << "以递归方法遍历二叉树:" << endl;
cout << "前序遍历结果:";
tree.preOrder(tree.Root());
cout << endl;
cout << "中序遍历结果:";
tree.inOrder(tree.Root());
cout << endl;
cout << "后序遍历结果:";
tree.postOrder(tree.Root());
cout << endl;
return 0;
}
怎么回事,就是CreateBiTree(BiTnode <T>* node)老出问题。
解决方案
6
节点没有开辟空间(分配内存)
17
template<typename T>
void BiTree<T>::CreateBiTree(BiTnode <T>* node)
这个函数的形参类型不能帮助完成创建新节点的任务,原因是在该函数内部新创建的结点地址是赋给该函数内部的临时指针变量,
而不是父节点的左右子树结点指针成员,所以要么改 形参为 指针的指针 ,要么改为 传引用。
void BiTree<T>::CreateBiTree(BiTnode <T>* node)
这个函数的形参类型不能帮助完成创建新节点的任务,原因是在该函数内部新创建的结点地址是赋给该函数内部的临时指针变量,
而不是父节点的左右子树结点指针成员,所以要么改 形参为 指针的指针 ,要么改为 传引用。