利用二叉树中序及先序(后序)遍历确定该二叉树的后序(先序)序列

利用二叉树中序及先序遍历确定该二叉树的后序序列:
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);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值