今天做的题目是关于二叉树的一些题。 主要涉及的是, 根据二叉树的三种遍历方式 。 我做了。已知前序和中序。 还有 已知后序和中序。 求三种排序方式的另外一种。
也让我更深刻的。感觉到了这三种排列方式的 一些细节。
我原本觉得这两个题目应该差不了多远。 但事实上还是有不少细节上的区分。
先说已知后序和中序吧。
题目如下。
这个题目具体的思路便是依靠中序 一些特性。来判断。左右子树的数量。 方法就是。把两种排序方式的左右边界输进一个函数中。 然后因为 在后序中。 根节点在最右边。然后以此就找到了根节点。然后这个根节点在遍历中序就能找到根节点 在中序中的位置。 这样的话就能得到根节点下左右两个子树的元素量。 然后因为,此题要的是前序排列。 所以每一次找到根节点。就可以直接输出。然后就是两个判定条件。以当前根结点在中序的位置为判断。 判断根节点的位置。是否为边界如果不为边界,说明还有子树。 就以子树为一个新的树。 分别 把 他在中序中的左右边界。以及在后序中的左右边界。 输进函数中进行递归。以此就能完成遍历。
具体代码如下
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
char s1[50];
char s2[50];
int l;
void f(int l1,int r1,int l2,int r2)
{
int m ;
for(int i=0;i<l;i++)
{
if(s1[i]==s2[r2]) m=i;
}
printf("%c",s2[r2]);
if(m>l1) {
f(l1,m-1,l2,r2-r1+m-1); }
if(m<r1) {
f(m+1,r1,l2+m-l1,r2-1);
}
}
int main()
{
cin>>s1;
cin>>s2;
l=strlen(s1);
f(0,l-1,0,l-1);
}
而我做的另外一题。就是以前序和中序来求后序。
我本来以为两者的代码只是改一点点数据就好。毕竟思路都是同一个。但是其中还有一个小细节。 首先它的函数返回方式会。不一样。 另外它的输出要在DFS函数后面。也就是说你递归后再进行输出。这样做的目的是后续输出要以叶子放在前面。 然后你设定的 递归终点。是遍历到叶子然后如果把输出 放在DFS函数后他就会。先输出子节点 然后输出根节点。 以此达到后序遍历。
代码如下, 可以多观察一下。两者的DFS函数
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
char a[50],b[50];
void dfs(int l1,int l2,int r1,int r2){
int m;
if(l1>l2||r1>r2)return;
for(int i=l1;i<=l2;i++)if(a[i]==b[r1]){
m=i;
}
dfs(l1,m-1,r1+1,r1+m-l1);
dfs(m+1,l2,r1+m-l1+1,r2);
printf("%c",a[m]);
}
int main()
{
cin>>a>>b;
int l= strlen(a);
dfs(0,l-1,0,l-1);
return 0;
}
还有一个。关于前中,后序遍历的问题我还没有做。 等明天做完了,再做一下总结吧。今天的总结就到这里了。