树 知道中序遍历 层次遍历 求先序遍历

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树 知道中序遍历 层次遍历 求先序遍历相关的知识,希望对你有一定的参考价值。

参考技术A 其实对于知道中序和先、后、层次之一求出树结构的基本思路都是一样的,都是根据后一种序列能直接找出根节点,从而将中序划分为两部分,然后再找出各自的根节点。

对于层序12345......而言,1一定是根节点,那么中序可以划分出(...)1(...),(...)1,1(...)三种可能的情况,假设是第一种。

那么23一定分别是左右两颗子树的根,假设再划分出的情况是(...)21(...)3(...)。

那么456一定是按顺序是从左往右那三颗子树的根节点。

以此类推。知道了树结构再求先序也不难了吧。

提供思路,具体代码还是自己写比较好,这也是一种锻炼。本回答被提问者采纳
参考技术B 这个算法可以根据输入的先序 和 中序遍历求后序遍历
void fff(int a,int b,int c)
int j;
if(b>c)
return;
if(b==c)
printf("%c",n[b]);
x++;
return;

for(j=b;j<=c;j++)
if(n[j]==m[a])
x++;
fff(x,b,j-1);
fff(x,j+1,c);
printf("%c",n[j]);
break;


int main ()
int i;
while(scanf("%s%s",m,n)!=EOF)
x=0;
l=strlen(m);
fff(0,0,l-1);
printf("\n");

return 0;

请采纳答案,支持我一下。追问

呵呵,我不是要这个,有了中序和前序我也可以找后序,就是不知道怎么有中序和层次遍历找前序而已,还有这个你是复制别人的,我之前看过这个程序

codevs 1013 求先序排列(二叉树遍历)

传送门

Description

给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。

Input

两个字符串,分别是中序和后序(每行一个)

Output

一个字符串,为二叉树的先序序列

Sample Input

BADC

BDCA

Sample Output

ABCD

思路

我们知道,前序遍历(PreOrder):根节点->左子树->右子树;中序遍历(InOrder):左子树->根节点->右子树;(PostOrder)后序遍历:左子树->右子数->根节点。故PostOrder的最后一个数为树根。由PostOrder找出树根后,可根据InOrder中分出树根的左右子树。InOrder中,树根左边为其左子树,右边为右子树。例如样例中:

in   : BADC

post:BDCA

左子树为B,右子树为DC;在InOrder中找根的位置pos;

则左子树中序序列为In.substr(0,pos),后序序列为Post.substr(0,pos)

右子树的先序序列为In.subst(pos+1,len-pos-1),后序序列为post.substr(pos,len-pos-1)

通过递归不断重复以后步骤,当串为空时退出

 
#include<bits/stdc++.h>
using namespace std;
string in,post;

void pre(string in,string post)
{
	if (post.empty())	return;
	int pos,len = post.size();
	char ch = post[len-1];
	cout << ch;
	pos = in.find(ch);
	pre(in.substr(0,pos),post.substr(0,pos));
	pre(in.substr(pos + 1,len - pos - 1),post.substr(pos,len - pos - 1));
}

int main()
{
	cin >> in >> post;
	pre(in,post);
	return 0;
} 

 

#include<bits/stdc++.h>
using namespace std;
const int maxn = 15;

void pre(int N,char a[],char b[])
{
	if (N <= 0)	return;
	int pos;
	for (int i = 0;i < N;i++)
		if (a[i] == b[N-1])	pos = i;
	printf("%c",b[N-1]);
	pre(pos,a,b);
	pre(N - pos - 1,a + pos + 1,b + pos);
}


int main()
{
	char a[maxn],b[maxn];
	scanf("%s %s",a,b);
	int len = strlen(a);
	pre(len,a,b);
	return 0;
}

  

以上是关于树 知道中序遍历 层次遍历 求先序遍历的主要内容,如果未能解决你的问题,请参考以下文章

codevs 1013 求先序排列(二叉树遍历)

数据结构——已知先序中序求后序,已知中序后序求先序

二叉树遍历的递归实现(先序中序后序和层次遍历)

已知先序和中序 求后序

二叉树遍历(先序,中序,后序,层序)递归和非递归形式

树——二叉树的先序中序和后序遍历