遍历问题时间限制空间限制题目等级 : 钻石题目描述我们都很熟悉二叉树的前序、中序、后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历,求它的后序遍历,相应的,已知一棵二叉树的后序遍历和中序遍历序列你也能求出它的前序遍历。然而给定一棵二叉树的前序和后序,你却不能确定其中序遍历序列,考虑如下图中的几棵二叉树:所有这些二叉树都有着相同的前序遍历和后序遍历,但中序遍历却不相同。
输入描述输入文件共2行,第一行表示该树的前序遍历结果,第二行表示该树的后序遍历结果。输入的字符集合为{a-z},长度不超过26。
输出描述输出文件只包含一个不超过长整型的整数,表示可能的中序遍历序列的总数。
样例输入abccba样例输出4思路只有一个儿子 的节点 才会在知道 前序后序 的情况下有不同的中序遍历,所以将题目转化成找 只有一个儿子的节点个数。
可以很容易的找出这类节点在前序后序中出现的规律。(前序中出现AB,后序中出现BA,则这个节点只有一个儿子)
每个这类节点有两种中序遍历(及儿子在左,儿子在右)根据乘法原理中序遍历数为 2^节点个数 种代码复制代码{}复制代码2010求后序遍历求后序遍历时间限制空间限制题目等级 : 白银题目描述输入一棵二叉树的先序和中序遍历序列,输出其后序遍历序列。
输入描述共两行,第一行一个字符串,表示树的先序遍历,第二行一个字符串,表示树的中序遍历。
输出描述仅一行,表示树的后序遍历序列。
样例输入样例输出数据范围及提示输入长度不大于255。
代码复制代码{}{}复制代码3143二叉树的序遍历二叉树的序遍历时间限制空间限制题目等级 : 白银题目描述求一棵二叉树的前序遍历,中序遍历和后序遍历输入描述第一行一个整数n,表示这棵树的节点个数。
接下来n行每行2个整数L和R。第i行的两个整数Li和Ri代表编号为i的节点的左儿子编号和右儿子编号。
输出描述输出一共三行,分别为前序遍历,中序遍历和后序遍历。编号之间用空格隔开。
样例输入52 34 50 00 00 0样例输出数据范围及提示代码复制代码{}{}{}{{}}
代码
复制代码
#include<iostream>
using namespace std;
int n;
struct node{
int l,r;
}tree[20];
void dfs(int v)
{
cout<<v<<' ';
if(tree[v].l!=0)dfs(tree[v].l);
if(tree[v].r!=0)dfs(tree[v].r);
}
void afs(int v)
{
if(tree[v].l!=0)afs(tree[v].l);
cout<<v<<' ';
if(tree[v].r!=0)afs(tree[v].r);
}www.feishenbo.cn
new.debangyouxi.com
http://www.sbsbo.cc
void cfs(int v)
{
if(tree[v].l!=0)cfs(tree[v].l);
if(tree[v].r!=0)cfs(tree[v].r);
cout<<v<<' ';
}
int main()
{www.hsl85.cn/
www.yghrcp88.cn/
www.ycyc66.cn/
int x,y;
for(int i=1;i<=n;i++)
{
cin>>x>>y;
tree[i].l=x;
tree[i].r=y;
}
dfs(1);cout<<endl;
afs(1);cout<<endl;
cfs(1);
}
输入描述输入文件共2行,第一行表示该树的前序遍历结果,第二行表示该树的后序遍历结果。输入的字符集合为{a-z},长度不超过26。
输出描述输出文件只包含一个不超过长整型的整数,表示可能的中序遍历序列的总数。
样例输入abccba样例输出4思路只有一个儿子 的节点 才会在知道 前序后序 的情况下有不同的中序遍历,所以将题目转化成找 只有一个儿子的节点个数。
可以很容易的找出这类节点在前序后序中出现的规律。(前序中出现AB,后序中出现BA,则这个节点只有一个儿子)
每个这类节点有两种中序遍历(及儿子在左,儿子在右)根据乘法原理中序遍历数为 2^节点个数 种代码复制代码{}复制代码2010求后序遍历求后序遍历时间限制空间限制题目等级 : 白银题目描述输入一棵二叉树的先序和中序遍历序列,输出其后序遍历序列。
输入描述共两行,第一行一个字符串,表示树的先序遍历,第二行一个字符串,表示树的中序遍历。
输出描述仅一行,表示树的后序遍历序列。
样例输入样例输出数据范围及提示输入长度不大于255。
代码复制代码{}{}复制代码3143二叉树的序遍历二叉树的序遍历时间限制空间限制题目等级 : 白银题目描述求一棵二叉树的前序遍历,中序遍历和后序遍历输入描述第一行一个整数n,表示这棵树的节点个数。
接下来n行每行2个整数L和R。第i行的两个整数Li和Ri代表编号为i的节点的左儿子编号和右儿子编号。
输出描述输出一共三行,分别为前序遍历,中序遍历和后序遍历。编号之间用空格隔开。
样例输入52 34 50 00 00 0样例输出数据范围及提示代码复制代码{}{}{}{{}}
代码
复制代码
#include<iostream>
using namespace std;
int n;
struct node{
int l,r;
}tree[20];
void dfs(int v)
{
cout<<v<<' ';
if(tree[v].l!=0)dfs(tree[v].l);
if(tree[v].r!=0)dfs(tree[v].r);
}
void afs(int v)
{
if(tree[v].l!=0)afs(tree[v].l);
cout<<v<<' ';
if(tree[v].r!=0)afs(tree[v].r);
}www.feishenbo.cn
new.debangyouxi.com
http://www.sbsbo.cc
void cfs(int v)
{
if(tree[v].l!=0)cfs(tree[v].l);
if(tree[v].r!=0)cfs(tree[v].r);
cout<<v<<' ';
}
int main()
{www.hsl85.cn/
www.yghrcp88.cn/
www.ycyc66.cn/
int x,y;
for(int i=1;i<=n;i++)
{
cin>>x>>y;
tree[i].l=x;
tree[i].r=y;
}
dfs(1);cout<<endl;
afs(1);cout<<endl;
cfs(1);
}