前序中序遍历问题

本文介绍了一种算法,该算法可以根据给定的二叉树前序和中序遍历序列来确定其后序遍历序列。通过递归地划分二叉树的左子树和右子树,最终输出后序遍历结果。算法的时间复杂度为O(n),空间复杂度也为O(n),适用于计算机科学领域的数据结构与算法课程。

问题描述:

给定一棵二叉树,已知二叉树的前序中序遍历序列,设计一个算法,确定该二叉树的后序遍历的序列。

数据结构:

采用STL中的string实现。

算法分析:

在中序序列中查找前序序列中的首元素,作为根节点,根节点之前为左子树的中序,之后为右子树的中序,然后对左右子树递归调用,直到子树元素为一个,即长度为一,输出。

时空复杂度分析

时间复杂度O(n);

空间复杂度O(n);

(n为节点数)

源代码:

#include <string> #include <iostream> using namespace std; void PIOto_PostO(string s1,string s2) { int k,len; string ts1,ts2; len=s1.length(); if (len==1) printf("%c",s1[0]); else { k=s2.find(s1[0]); if (k>0) { ts1=s1.substr(1,k); ts2=s2.substr(0,k); PIOto_PostO(ts1,ts2); } if (k<len-1) { ts1=s1.substr(k+1,len-k-1); ts2=s2.substr(k+1,len-k-1); PIOto_PostO(ts1,ts2); } printf("%c",s2[k]); } } int main() { string sp,st; //freopen("treer.in","r",stdin); //freopen("treer.out","w",stdout); while (cin>>sp>>st) { PIOto_PostO(sp,st); cout<<endl; } return 0; }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值