这段代码存在几个问题:
在BiTree类的构造函数中,调用了Create函数来创建二叉树,但是在声明BiTree对象时并没有传入参数,所以需要将构造函数的定义修改为:
BiTree(T data[], int n)
。在PreOrder、InOrder和PostOrder函数中,递归调用的应该是对应结点的子树,而不是一直调用PreOrder函数。所需要将
PreOrder(R->lchild);
和PreOrder(R->rchild);
修改为InOrder(R->lchild);
和InOrder(R->rchild);
,同时,在PostOrder函数中也要做相应的修改。在主函数main()中,创建BiTree对象时缺少参数,并且声明了一个未使用的变量i。可以将声明改为
BiTree<int> tree(data, n);
,并删除int i=1;。
下面是修正后的代码:
#include <iostream>
using namespace std;
template<class T>
class BiNode
{
public:
T data;
BiNode<T>* parent;
BiNode<T>* lchild;
BiNode<T>* rchild;
};
template<class T>
class BiTree
{
public:
void Create(BiNode<T>*& R, T data[], int i, int n);//创建二叉树
void Release(BiNode<T>* R); //释放二叉树
BiNode<T>* root;//根结点
BiTree(T data[], int n);//构造函数
void PreOrder(BiNode<T>* R);//前序遍历
void InOrder(BiNode<T>* R);//中序遍历
void PostOrder(BiNode<T>* R);//后序遍历
void LevelOrder(BiNode<T>* R);//层序遍历
~BiTree();//析构函数
};
template<class T>
void BiTree<T>::Create(BiNode<T>*& R, T data[], int i, int n)//i表示位置,从1开始
{
if (i <= n && data[i - 1] != 0)
{
R = new BiNode<T>;//创建根结点
R->data = data[i - 1];
R->lchild = R->rchild = NULL;
Create(R->lchild, data, 2 * i, n);//创建左子树
Create(R->rchild, data, 2 * i + 1, n);//创建右子树
}
}
template<class T>
BiTree<T>::BiTree(T data[], int n)
{
Create(root, data, 1, n);
}
//前序遍历
template<class T>
void BiTree<T>::PreOrder(BiNode<T>* R)
{
if (R != NULL)
{
cout << R->data; //访问结点
PreOrder(R->lchild);
PreOrder(R->rchild);
}
}
//中序遍历
template<class T>
void BiTree<T>::InOrder(BiNode<T>* R)
{
if (R != NULL)
{
InOrder(R->lchild);
cout << R->data; //访问结点
InOrder(R->rchild);
}
}
//后序遍历
template<class T>
void BiTree <T >::PostOrder(BiNode <T >* R)
{
if (R != NULL)
{
PostOrder(R->lchild);
PostOrder(R->rchild);
cout << R->data; //访问结点
}
}
int main()
{
int n = 5;
BiTree<int> tree(data, n);
int data[5] = { 1,2,3,4,5 };
BiNode<int>* Root;
tree.Create(Root, data, 1, n);
tree.InOrder(Root);
return 0;
}
这样,代码就能正确创建二叉树并进行中序遍历了。
内容由零声教学AI助手提供,问题来源于学员提问