求先序遍历
作者:互联网
(一道dfs的小水题)
前段时间校内集训的时候
学长还曾抛出过这个问题
然而我又咕掉了
(期中之后准备洗心革面的我决心从dfs开始复(学)习
(卑微
----------------------------------------------------------------------------------------
题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度≤8 \le 8≤8)。
输入输出格式
输入格式: 2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。输出格式:
1行,表示一棵二叉树的先序。
输入输出样例
输入样例#1:BADC BDCA输出样例#1:
ABCD
----------------------------------------------------------------------------------------
先序遍历
根-->左子树-->右子树
中序遍历
左子树-->根-->右子树
后序遍历
左子树-->右子树-->根
层次遍历
仅仅需按层次遍历就可以
前序遍历:1 2 4 5 7 8 3 6
中序遍历:4 2 7 5 8 1 3 6
后序遍历:4 7 8 5 2 6 3 1
层次遍历:1 2 3 4 5 6 7 8
-----------------------------------------------------------------------------------------------
由于后序遍历最后遍历到根的特点
所以后序遍历的最后一个点一定是根节点
由此在中序遍历的序列中
找到根节点
就可以把中序遍历分成两部分:左子树和右子书
递归下去就可以
-------------------------------------------------------------------------------------------------
#include<cstdio> #include<cstring> #include<iostream> using namespace std; char a[10],b[10]; int len; void dfs(int l,int r,int ll,int rr)//后序遍历区间l,r;中序遍历区间ll,rr { if(l == r) { cout<<b[r]; return; } if(l > r) return; cout<<b[r]; int cnt = 0,mrk; for(int i = ll;i <= rr;i++) { if(a[i] == b[r]) { mrk = i; break; } else cnt++; } dfs(l,l+cnt-1,ll,mrk - 1); dfs(l+cnt,r - 1,mrk+1,rr); } int main() { scanf("%s",a); scanf("%s",b); len = strlen(a); dfs(0,len - 1,0,len - 1); return 0; }
标签:左子,遍历,求先序,后序,int,中序,二叉树 来源: https://www.cnblogs.com/darlingroot/p/10851561.html