0
点赞
收藏
分享

微信扫一扫

1.18日学习总结

GG_lyf 2022-01-20 阅读 53

今天做的题目是关于二叉树的一些题。 主要涉及的是, 根据二叉树的三种遍历方式 。 我做了。已知前序和中序。 还有 已知后序和中序。 求三种排序方式的另外一种。

也让我更深刻的。感觉到了这三种排列方式的 一些细节。

我原本觉得这两个题目应该差不了多远。 但事实上还是有不少细节上的区分。

先说已知后序和中序吧。

题目如下。

这个题目具体的思路便是依靠中序 一些特性。来判断。左右子树的数量。 方法就是。把两种排序方式的左右边界输进一个函数中。 然后因为 在后序中。 根节点在最右边。然后以此就找到了根节点。然后这个根节点在遍历中序就能找到根节点 在中序中的位置。 这样的话就能得到根节点下左右两个子树的元素量。 然后因为,此题要的是前序排列。 所以每一次找到根节点。就可以直接输出。然后就是两个判定条件。以当前根结点在中序的位置为判断。 判断根节点的位置。是否为边界如果不为边界,说明还有子树。 就以子树为一个新的树。 分别 把 他在中序中的左右边界。以及在后序中的左右边界。 输进函数中进行递归。以此就能完成遍历。

具体代码如下

#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;
}

 

还有一个。关于前中,后序遍历的问题我还没有做。 等明天做完了,再做一下总结吧。今天的总结就到这里了。

举报

相关推荐

1.18今日总结

2.17日学习总结

2.14日学习总结

2.9日学习总结

1.20日学习总结

1.19日学习总结

1月23日学习总结

0 条评论