P1030 先序求二叉树
题的意思也比较好理解,就是给出中序和后序遍历的次序,让你输出树的前序遍历的次序。
科普区
树的结点构造
struct node{
int val;
node *left;
node *right;
};
node *root;
树的前序遍历
从根节点开始,按找先访问父母结点,再访问左子树和右子树的顺序规则,一直遍历到空结点就结束当前子树的遍历。
void preoder(node *n){
if(node==NULL)//当前结点为空
return;
cout<<n->val<<" ";
preoder(n->left);//访问左子树
preoder(n->right);//访问右子树
}
void preoder(){
preoder(root);
}
树的中序遍历
从根节点开始,按找先访问左子树,再访问父母结点,最后访问右子树的顺序规则,一直遍历到空结点就结束当前子树的遍历。
void inoder(node *n){
if(node==NULL)//当前结点为空
return;
inoder(n->left);//访问左子树
cout<<n->val<<" ";
inoder(n->right);//访问右子树
}
void inoder(){
inoder(root);
}
树的后序遍历
从根节点开始,按找先访问左子树,再访问右树,最后访问父母结点的顺序规则,一直遍历到空结点就结束当前子树的遍历。
void postoder(node *n){
if(node==NULL)//当前结点为空
return;
postoder(n->left);//访问左子树
cout<<n->val<<" ";
postoder(n->right);//访问右子树
}
void postoder(){
postoder(root);
}
主要就是两个算法,一个时用二分查找,求出树的结点个数,另一个就是深度优先搜索算法。算法流程在注释中解释的很清楚,废话不多说,就直接粘代码吧!
#include<bits/stdc++.h>
using namespace std;
const int MAXN=10;//最大数据规模
char a[MAXN];//存放中序序列
char b[MAXN];//存放后序序列
void dfs(int left,int right,int cur) {
//当前子树的左右left指针和right指针相等时,表示当前
if(left==right) {
cout<<b[cur];//输出当前结点的值
return;
}
//从左向右依次查找后序遍历cur结点值与中序遍历i结点值是否相等
for(int i=left; i<=right; i++) {
//结点值相等时
if(a[i]==b[cur]) {
cout<<b[cur];//输出后序遍历的值
int k=right-i+1;//求出中序遍历的k值
dfs(left,i-1,cur-k);//搜索左子树
dfs(i+1,right,cur-1);//搜索右子树
break;
}
}
}
//求取数的结点数
int get_len() {
int left=0,right=MAXN-1;
int mid;
//二分查找
while(left<=right) {
mid=(left+right)/2;
//判断当前mid结点是否为需要树的最后结点的下标
if((b[mid]!='\0' && b[mid]!='\n') && (b[mid+1]=='\0' || b[mid+1]=='\n'))
return mid;
if(b[mid]>='A' && b[mid]<='Z') {
left=mid+1;
} else {
right=mid-1;
}
}
return mid;
}
int main() {
cin>>a;
cin>>b;
int len=get_len();
dfs(0,len,len);
cout<<endl;
return 0;
}