浏览器标题切换
浏览器标题切换end

寒假Day30:二叉树的遍历相关题型(求先序或后序、搜索树的判断)

HDU1710 - Binary Tree Traversals

题意:已知前序中序求后序

思路:模板题

AC代码:

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=1010;

int pre[N],in[N],post[N],id[N],p;

//前序起点、前序终点、中序起点、中序终点
void dfs(int l,int r,int L,int R)
{
    int root=id[pre[l]];
    int ls=root-L;//中序左子树节点个数
    int rs=R-root;//中序右子树节点个数
    if(ls)//左子树非空
        dfs(l+1,l+root,L,root-1);    //dfs(l+1,l+root-1,L,root-1); 也能过
    if(rs)//右子树非空
        dfs(l+ls+1,r,root+1,R);
    post[++p]=pre[l];//当左子树是空的右子树也是空的说明是叶节点、记录即可
}
int main()
{
    int n;
    while(cin>>n)
    {
        p=0;
        for(int i=1;i<=n;i++)
            cin>>pre[i];
        for(int i=1;i<=n;i++)
        {
            cin>>in[i];
            id[in[i]]=i;
        }
        dfs(1,n,1,n);
        for(int i=1;i<n;i++)
            cout<<post[i]<<" ";
        cout<<post[n]<<endl;
    }
    return 0;
}

计蒜客T2113 - 求先序排列

题意:已知中序后序求先序

思路:模板题

AC代码:

#include<string.h>
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<map>
#include<cmath>
using namespace std;
#define inf 0x3f3f3f3f
 const int N=500200*2;

 char s1[10],s2[10];
 void w(int l1,int r1,int l2,int r2)
 {
     int k=-1;
     for(int i=l1; i<r1; i++)
     {
         if(s1[i]==s2[r2-1])
         {
             printf("%c",s1[i]);
             k=i;
             break;
         }
     }
     if(k>l1) //左
         w(l1,k,l2,k-l1+l2);
     if(r1>k+1) //右
         w(k+1,r1,k-l1+l2,r2-1);
 }

 int main()
 {
     cin>>s1>>s2;
     int l1=strlen(s1);
     int l2=strlen(s2);
     w(0,l1,0,l2);
     return 0;
 }

HDU3791 - 二叉搜索树

题意:判断两个序列是否能够构成二叉搜索树

思路:利用中序遍历

AC代码:

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
using namespace std;
typedef long long ll;

char a[15],b[15];
bool flag;

struct node
{
    int x;// 值
    node *l,*r;
};

node *insertt(node *p,int xx)//依次插入每个值
{
    if(p==NULL)//如果当前节点为空则插入
    {
        node *q=new node;//申请一个动态空间
        q->x=xx;//赋值
        q->l = q->r =NULL;//左右儿子为空
        return q;//返回此节点的地址
    }
    //说明有值,继续往下找,遵循左小右大
    if(p->x>xx)//xx<左儿子,继续往左走
        p->l=insertt(p->l,xx);
    else
        p->r=insertt(p->r,xx);
    return p;
}

void check(node *root,node *tree)//传入地址
{
    if(root!=NULL&&tree!=NULL)//说明此节点两棵树都有值,只需判断值是否相等
    {
        check(root->l,tree->l);//中序遍历
        if(root->x!=tree->x)//判断此节点的值是否和标准树相等
            flag=0;
        check(root->r,tree->r);
    }
    else if(root!=NULL||tree!=NULL)//只有一个节点有值
        flag=0;
}

int main()
{
    int n;
    while(~scanf("%d",&n)&&n)
    {
        node *root=NULL;//标准树地址为空
        scanf("%s",a);
        int la=strlen(a);
        for(int i=0; i<la; i++)
            root=insertt(root,a[i]-'0');//构建一颗标准树
        for(int i=1; i<=n; i++)
        {
            flag=1;
            node *tree=NULL;//判断树地址为空
            scanf("%s",b);
            int lb=strlen(b);
            for(int i=0; i<lb; i++)
                tree=insertt(tree,b[i]-'0');
            check(root,tree);
            if(flag)
                printf("YES\n");
            else
                printf("NO\n");
        }
    }
    return 0;
}
posted @ 2020-02-16 14:59  抓水母的派大星  阅读(153)  评论(0编辑  收藏  举报