实验内容
①输入一个完全二叉树的层次遍历字符串,创建这个二叉树,输出这个二叉树的前序遍历字符串、中序遍历字符串、后序遍历字符串、结点数目、二叉树高度(上述每一个结果独立一行显示)。
②输入二叉树前序序列和中序序列(各元素各不相同),创建这个二叉树,输出该二叉树的后序序列、层次遍历。
实验步骤
①参考ppt复习,编写BinaryTreeNode节点类,为了方便操作,我把其中的数据,左子和右子都设置成了public。初始化节点类,也是构造了指针数组,对每个类对象都实例化,然后左子2*i,右子2*i+1的方法来的。由于元素不多,树的高度也通过遍历计算2的几次方减1,对比实现。
②编写递归程序->前序遍历、中序遍历、后序遍历,注意输出最后一个字符的时候不能有多余的逗号,需要和输入字符串最后一位比较判断。
③编写返回节点指针的build方法,这里也是递归的思想。从前序遍历中取出第一个元素,就是当前树的“根节点”,然后在中序遍历中找到该元素,该元素的左树就是从pre+1开始对中序0~k-1左子序列的k个元素递归,右树类似。
④编写层次遍历方法,需要用到队列。仔细看看层序遍历过程,其实就是从上到下,从左到右依次将每个数放入到队列中,然后按顺序依次打印就是想要的结果。
实现过程
1、首先将二叉树的根节点push到队列中,判断队列不为NULL,就输出队头的元素,
2、判断节点如果有孩子,就将孩子push到队列中,
3、遍历过的节点出队列,
4、循环以上操作,直到Tree == NULL。
本次实验主要代码:
#include<bits/stdc++.h>
using namespace std;
string s;
string pree,inn;
const char*preorder;
const char* inorder;
class BinaryTreeNode{
public:
BinaryTreeNode *left;
BinaryTreeNode *right;
char data;
};
void Pre(BinaryTreeNode *t){
if(t!=NULL){
if(s[s.size()]!=t->data)
cout<<t->data<<",";
else
cout<<t->data;
Pre(t->left);
Pre(t->right);
}
}
void in(BinaryTreeNode *t){
if(t!=NULL){
in(t->left);
if(s[s.size()]!=t->data)
cout<<t->data<<",";
else
cout<<t->data;
in(t->right);
}
}
void post(BinaryTreeNode *t,char s){
if(t!=NULL){
post(t->left,s);
post(t->right,s);
if(s!=t->data)
cout<<t->data<<",";
else
cout<<t->data;
}
}
void level(BinaryTreeNode *t){
queue<BinaryTreeNode*> q;
q.push(t);
bool flag = true;
if(pree.size()==1){
flag = false;
}
while(!q.empty()&&(q.size()!=1||flag)){
flag = false;
cout << q.front()->data << ",";
if (q.front()->left != NULL)
{
q.push(q.front()->left);
}
if (q.front()->right != NULL)
{
q.push(q.front()->right);
}
q.pop();
}
cout << q.front()->data;
}
BinaryTreeNode * build(const char* preorder,const char* inorder,int n){
if(n==0)return NULL;
int k=0;
while(preorder[0]!=inorder[k])k++;
BinaryTreeNode *t=new BinaryTreeNode;
t->data = preorder[0];
t->left=build(preorder+1,inorder,k);
t->right = build(preorder+k+1,inorder+k+1,n-k-1);
return t;
}
int main(){
cout<<"Input1"<<endl;
int num = 0;
cin>>s;
for(int i=s.size()+1;i>0;i--){
s[i]=s[i-1];
}
BinaryTreeNode **b=new BinaryTreeNode*[20];
for(int i=0;i<20;i++){
b[i] = new BinaryTreeNode;
}
for(int i=1;i<=s.size();i++){
b[i]->data=s[i];
}
for(int i=1;i<=s.size();i++){
if(2*i<=s.size()){
b[i]->left=b[2*i];
}
else{
b[i]->left=NULL;
}
if(2*i+1<=s.size()){
b[i]->right=b[2*i+1];
}
else{
b[i]->right=NULL;
}
}
cout<<"Output1"<<endl;
Pre(b[1]);
cout<<endl;
in(b[1]);
cout<<endl;
post(b[1],s[1]);
cout<<endl<<s.size()<<endl;
for(int i=1;i<=6;i++){
if(pow(2,i)-1==s.size()){
cout<<i<<endl;
break;
}
}
cout<<"Input2"<<endl;
cin>>pree>>inn;
preorder = pree.data();
inorder = inn.data();
cout<<"Output2"<<endl;
post(build(preorder,inorder,pree.size()),pree[0]);
cout<<endl;
level(build(preorder,inorder,pree.size()));
cout<<endl<<"End0"<<endl;
return 0;
}