7-1 还原二叉树 (25 分)
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
输入格式:
输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
输出格式:
输出为一个整数,即该二叉树的高度。
#include<bits/stdc++.h>
using namespace std;
int height(char a[],char b[],int n)
{
int i;
if(n==0)return 0;
for(i=0;i<n;i++)
{
if(b[i]==a[0])
{
break;
}
}
int x=height(a+1,b,i)+1;//求左子树的深度
int y=height(a+i+1,b+i+1,n-i-1)+1;//求右子树的深度
return x>y?x:y;
}
int main()
{
char a[101];
char b[101];
int n;
cin>>n;
cin>>a>>b;
int cnt=height(a,b,n);
cout<<cnt<<endl;
}
7-6 交换二叉树中每个结点的左孩子和右孩子 (20 分)
以二叉链表作为二叉树的存储结构,交换二叉树中每个结点的左孩子和右孩子。
输入格式:
输入二叉树的先序序列。
提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。
输出格式:
输出有两行:
第一行是原二叉树的中序遍历序列;
第二行是交换后的二叉树的中序遍历序列。
#include<bits/stdc++.h>
using namespace std;
struct node
{
char data;
struct node *l,*r;
};
//建立链表结构树的函数
struct node *sett()
{
struct node *p;//建立结构类型的指针结点p
p=new node;
char ch;//先序输入建立树
cin>>ch;
if(ch=='#')
p=NULL;
else
{
p->data=ch;
p->l=sett();
p->r=sett();
}
return p;
};
//遍历输出交换前的:用左根右(递归本函数)
void show(struct node *p)
{
if(p==NULL)
return;
show(p->l);
cout<<p->data;
show(p->r);
}
//遍历输出交换后的:右根左(递归本函数)
void showw(struct node *p)
{
if(p==NULL)
return;
showw(p->r);
cout<<p->data;
showw(p->l);
}
int main()
{
struct node *treee;
treee=sett();
show(treee);
cout<<endl;//换行
showw(treee);
}
7-8 建立与遍历二叉树 (25 分)
以字符串的形式定义一棵二叉树的先序序列,若字符是‘#’, 表示该二叉树是空树,否则该字符是相应结点的数据元素。读入相应先序序列,建立二叉链式存储结构的二叉树,然后中序遍历该二叉树并输出结点数据。
输入格式:
字符串形式的先序序列(即结点的数据类型为单个字符)
输出格式:
中序遍历结果
#include<bits/stdc++.h>
using namespace std;
struct node
{
char data;
struct node *l,*r;
};
struct node *sett()
{
struct node *p;
p=new node;
char ch;
cin>>ch;
if(ch=='#')
p=NULL;
else
{
p->data=ch;
p->l=sett();
p->r=sett();
}
return p;
};
void show(struct node *p)
{
if(p==NULL)
return;
show(p->l);
cout<<p->data;
show(p->r);
}
int main()
{
struct node *p;
p=sett();
show(p);
}
7-9 完全二叉树的层序遍历 (25 分)
一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树。对于深度为 D 的,有 N 个结点的二叉树,若其结点对应于相同深度完美二叉树的层序遍历的前 N 个结点,这样的树就是完全二叉树。
给定一棵完全二叉树的后序遍历,请你给出这棵树的层序遍历结果。
输入格式:
输入在第一行中给出正整数 N(≤30),即树中结点个数。第二行给出后序遍历序列,为 N 个不超过 100 的正整数。同一行中所有数字都以空格分隔。
输出格式:
在一行中输出该树的层序遍历序列。所有数字都以 1 个空格分隔,行首尾不得有多余空格。
#include<bits/stdc++.h>
using namespace std;
int t[35];
int m,n;
struct node
{
char data;
struct node*l,*r;
};
void sett(int i)
{
if(i>n)//如果要建立的第i结点大于n总结点数
return;
sett(2*i);//建立左孩子
sett(2*i+1);//建立右孩子
cin>>t[i];
}//给定的树为后序
int main()
{
cin>>n;
sett(1);//从第一个结点开始建立,递归
for(int i=1;i<=n;i++)
{
if(i==1)
cout<<t[i];
else
cout<<" "<<t[i];
}
}