利用二叉树中序及先序遍历确定该二叉树的后序序列:
suwst oj#984
1.原理很简单先根据先序第一个节点为根节点的性质查找根节点在中序遍历中的位置以便确定中序遍历左右子树的节点个数。
2.根据左右子树节点个数确定先序遍历中左右子树 的遍历情况。
3.重复上面步骤。
附代码:
#include <iostream>
#include <string>
using namespace std;
#define int long long
string n,m;
void xianxu(int llf,int rrt,int lf,int rt){
if(lf<0||lf>=n.size()||lf>rt||rt<0||rt>=n.size()) return ;//判断后序排列区间是否合法
if(llf<0||llf>=n.size()||llf>rrt||rrt<0||rrt>=n.size()) return ;//判断先序排列区间是否合法
int k;
for(int i=0;i<n.size();i++){//寻找根节点
if(n[i]==m[lf]){
k=i; break;
}
}
int l=k-llf;//判断左子树节点个数
xianxu(llf,k-1,lf+1,lf+l);//递归左子树
xianxu(k+1,rrt,lf+l+1,rt);//递归右子树
cout<<m[lf];//后序输出
}
signed main(){
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin>>n>>m;
xianxu(0,n.size()-1,0,n.size()-1);
}
利用二叉树中序及后序遍历确定该二叉树的先序序列:
swust oj#983
原理和上面差不多只不过变成了后序遍历最后一个节点为根节点而已简单改改就是了:
附代码:
#include <iostream>
#include <string>
using namespace std;
#define int long long
string n,m;
void xianxu(int llf,int rrt,int lf,int rt){
if(lf<0||lf>=n.size()||lf>rt||rt<0||rt>=n.size()) return ;
if(llf<0||llf>=n.size()||llf>rrt||rrt<0||rrt>=n.size()) return ;
int k;
for(int i=0;i<n.size();i++){//寻找根节点
if(n[i]==m[rt]){
k=i; break;
}
}
cout<<m[rt];//先序输出
int l=k-llf;//计算左子树节点个数
xianxu(llf,k-1,lf,lf+l-1);//遍历左子树
xianxu(k+1,rrt,lf+l,rt-1);//遍历右子树
}
signed main(){
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin>>n>>m;
xianxu(0,n.size()-1,0,n.size()-1);
}