二叉树的建立(输入先序和中序遍历后序)
【问题描述】
已知二叉树的先序和中序遍历序列,推出它的后序遍历序列。
输入: 共两行,第1行一一个字符串,表示树的先序遍历,第2行一个字符串,表示树的中序遍历。树的结点一律用小写字母表示。
输出: 仅一行,表示树的后序遍历序列。
【样例输入】
abdec
dbeac
【样例输出】
debca
#include<iostream> #include<cstring> using namespace std; char pre[101], mid[101]; int root=0, cnt=0,n; // 分别表示根节点的下标、编号和个数。 struct node{ char value; // 节点名称。 int lchild, rchild; } data[101]; // 声明node类型的数组data。 int create(int preL, int preR, int midL, int midR, int rt){ if(preL>preR) return 0; // 递归的边界条件。 rt=++cnt; // 找到每个根节点的位置index。 int index; for(int i=midL; i<=midR; i++){ if(mid[i]==pre[preL]) { index=i; break; } } data[rt].value=mid[index]; int numLeft = index-midL; data[rt].lchild=create(preL+1, preL+numLeft, midL, index-1, rt); data[rt].rchild=create(preL+numLeft+1, preR, index+1, midR, rt); return rt; } void rootPos(int rt){ if(rt){ rootPos(data[rt].lchild); rootPos(data[rt].rchild); cout<<data[rt].value; } return; } int main(){ cin>>pre>>mid; n=strlen(pre); int root = create(0, n-1, 0, n-1, 0); // 分别传入先序和中序的左端元素和右端元素的下标与根节点的下标。 rootPos(root);// 后序遍历输出:寻找节点的位置。 return 0; }
#include<iostream> #include<cstring> using namespace std; // abdec dbeac char pre[101], mid[101]; int cnt=0; // 用于根节点累加器。 struct node{ char value; int lchild, rchild; } data[101]; int create(int preL, int preR, int midL, int midR, int pos){ if(preL>preR) return 0; pos=++cnt; // 如果preL<=preR,继续下一个结点。 // 判断每个树的根节点。 int i; // 根据中序找到根节点。 for(i=midL; i<=midR; i++){ if(pre[preL]==mid[i]) break; // 找到根节点i后结束循环。 } // 先序遍历: 根结点->左子树->右子树。 // 利用中序找到根节点并存储根节点元素。 data[pos].value=mid[i]; // 分根据先序规则分别递归(遍历)左子树和右子树。 int numL=i-midL; // 计算左子树元素的个数。 // i-1: 中序数组的左子树的最后一个元素的下标。 data[pos].lchild=create(preL+1, preL+numL, midL, i-1, pos); data[pos].rchild=create(preL+numL+1, preR, i+1, midR, pos); return pos; } // 后序遍历树操作。 void rootNode(int pos){ //如果当前根节点下标不为0,则依次按照左、右、根顺序递归(遍历)树的结点。 if(pos){ rootNode(data[pos].lchild); rootNode(data[pos].rchild); cout<<data[pos].value; } return; } int main(){ cin>>pre>>mid; // 获取字符串的长度,即结点的总个数。 int n=strlen(pre); // 调用create()创建结点并获取根节点的位置。 // 依次传递先序和中序字符数组最左端、最右端的元素下标以及根节点的下标(先序的首元素的下标)。 int root=create(0,n-1,0,n-1,0); rootNode(root); return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
2020-07-23 输出m到n之间的质数