December 10, 2015 10:54 AM
第一步:创建一个二叉树结点类
class BiTNode //树结点类
{
public:
char data;
class BiTNode *lchild, *rchild;
};
typedef BiTNode* BiTree; //定义一个二叉树结点
第二步:建立一棵二叉树
void CreateBiTree(BiTree *T) //创建一棵二叉树,约定用户遵照前序遍历输入数据
{
char c;
while(!(c = cin.get())) //判断输入是否有误,如果有误清理缓冲重新输入
{
cin.clear(); //清除出错状态
cin.ignore(); //将缓冲区里边现有的数据全部丢弃
cout << "Input error!!!"<<endl;
}
if(c == ' ') //如果输入数据为空格,代表没有相应结点
{
*T = NULL;
}
else //递归生成二叉树
{
*T = new(BiTNode);
(*T)->data = c;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
}
第三步:二叉树遍历
void vistit(char data, int level) 访问二叉树结点
{
cout << data << "位于第" << level << "层" <<endl;
}
void PreTravers(BiTree T, int level) //前序遍历二叉树
{
if(T)
{
vistit(T->data, level); //先访问根结点。然后左子树、右子树
PreTravers(T->lchild, level+1); //更改此处三句话的顺序便得到不同的遍历结果
PreTravers(T->rchild, level+1);
}
}
第四步:主函数运行测试
int main(int argc, char** argv) {
BiTree T = NULL; //先定义一个空树
int level = 1; //从第一层开始创建
CreateBiTree(&T); //创建二叉树
PreTravers(T, level); //二叉树遍历
return 0;
}
输入数据时注意:
1.本程序的输入时按照前序遍历的方式存储数据;
2.在数据读入时,遇到叶子结点,叶子结点的左右子树用空格代替,因为只有前序遍历是无法确定一棵二叉树的。
例如,对于下图所示二叉树,应输入:(ABC DE G F ),C、D之间是两个空格,E、G之间是一个空格,G和F之后是两个空格。