求二叉树某结点在先序、中序、后序遍历中的访问次序
实验内容及要求:
设二叉树采用二叉链表存储结构,结点数据域为字符类型。编写程序,用先序递归遍历法建立二叉树的二叉链表存储结构(输入先序遍历序列时,用字符'*'表示NULL指针)。然后输入一个字符,输出该字符在先、中、后序遍历中的访问次序(访问次序从1开始)以及先、中、后序遍历结果。若输入的字符不在二叉树中,输出相应提示信息。要求程序可以反复输入字符并输出访问次序及遍历结果,当输入的单个字符为'#'时,结束整个应用程序。
注意:输入单个字符时需对其后的换行符进行处理。
实验目的:掌握二叉树的基本算法、提前中止递归的方法,递归函数的形参与返回值设置。
#include<iostream>
#include<fstream>
using namespace std;
int countnode = 0;
typedef struct Tree
{
char e;
Tree* lchild;
Tree* rchild;
}T;
T* CreatTree(T* bt, char* temp)//先序建立二叉树
{
static int i = 0;
char c;
//cout << "请输入节点字符" << endl;
//if ((c = _getche()) == '#')
if ((c = temp[i++]) == '*')//括号很重要,因为==的优先级大于赋值运算符
return 0;
else
{
bt = new T;
countnode++;
bt->e = c;
bt->lchild = CreatTree(bt->lchild, temp);
bt->rchild = CreatTree(bt->rchild, temp);
return bt;
}
}
void Preorder(T* bt)
{
if (!bt)return;
else
{
cout << bt->e << " ";
Preorder(bt->lchild);
Preorder(bt->rchild);
}
}//前序遍历
void PreorderI(T* bt,char e,int &i)//i既用来计数,又用作返回判断的标志变量
{//先序遍历二叉树且计数
if (!bt||i>0)return;
else
{
if (bt->e == e)
{
i--;
i = -i;
}
else
{
if (!bt || i > 0)return;
cout << bt->e << " ";
i--;
}
PreorderI(bt->lchild, e, i);
PreorderI(bt->rchild, e, i);
}
}
void Midorder(T* bt)
{
if (!bt)return;
Midorder(bt->lchild);
cout << bt->e << " ";
Midorder(bt->rchild);
}//中序遍历
void MidorderI(T* bt, char e, int& i)//中序遍历二叉树且计数
{
if (!bt || i > 0)return;
MidorderI(bt->lchild, e, i);
if (bt->e == e)
{
i--;
i = -i;
return;
}
else
{
if (!bt || i > 0)return;
i--;
}
MidorderI(bt->rchild, e, i);
}
void Lasorder(T* bt)
{
if (!bt)return;
Lasorder(bt->lchild);
Lasorder(bt->rchild);
cout << bt->e << " ";
}//后序遍历
void lasorderI(T* bt, char e, int& i)//后序遍历二叉树且计数
{
if (!bt || i > 0)
return;
lasorderI(bt->lchild, e, i);
lasorderI(bt->rchild, e, i);//子函数执行完,不都会从最上面开始,所以else里面也要有返回判断,保证任何时刻都可以及时退出
if (bt->e == e)
{
i--;
i = -i;
return;
}
else
{
if (!bt || i > 0)
return;
i--;
}
}
int main(void)
{
char c;
T* bt = NULL;
ofstream OutFile("Test.txt");
OutFile << "ABC**DE*G**F***";//利用文件保存节点,方便测试
OutFile.close();
ifstream readFile("Test.txt");
char temp[100] = { 0 };
readFile >> temp;
bt = CreatTree(bt, temp);
while (1)
{
int pre = 0;
int mid = 0;
int las = 0;
cout << "请输入想要查找的节点" << endl;
cin >> c;
if (c == '#')
break;
Preorder(bt);
PreorderI(bt, c, pre);
if (pre < 0)
cout << "不在树中" << endl;
else
cout << "第" << pre << "个遍历" << endl;
Midorder(bt);
MidorderI(bt, c, mid);
if (mid < 0)
cout << "不在树中" << endl;
else
cout << "第" << mid << "个遍历" << endl;
Lasorder(bt);
lasorderI(bt, c, las);
if (las < 0)
cout << "不在树中" << endl;
else
cout << "第" << las << "个遍历" << endl;
}
return 0;
}