1499 - 二叉搜索树

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 32 MB

判断两序列是否为同一二叉搜索树序列

题目输入

开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。

接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。

题目输出

如果序列相同则输出YES,否则输出NO

输入/输出样例

输入格式

6
45021
12045
54120
45021
45012
21054
50412
0

输出格式

NO
NO
YES
NO
NO
NO

C语言解答

#include <stdio.h>
#include <string.h>
int sort(char str[])
{
  int set[11];
  for(int i=0;i<11;i++)
    set[i]=0;
  char qe[11];
  int first=0,rear=0;
  qe[rear++]=str[0];
  set[str[0]-'0']=1;
  while(first!=rear)
  {
    char ch=qe[first++];
    for(int i=0;i<strlen(str);i++)
    {
      if(ch>str[i]&&set[str[i]-'0']==0)
      {
        set[str[i]-'0']=1;
        qe[rear++]=str[i];
        break;
      }
    }
    for(int i=0;i<strlen(str);i++)
    {
      if(ch<str[i]&&set[str[i]-'0']==0)
      {
        set[str[i]-'0']=1;
        qe[rear++]=str[i];
        break;
      }
    }
  }
  for(int i=0;i<strlen(str);i++)
  {
    str[i]=qe[i];
  }
  return 0;
  
}
int main()
{
  while(1)
  {
    int n;
    char std[11];
    char in[11];
    
    scanf("%d",&n);
    if(n==0)
    {
      break;
    }
    scanf("%s",std);
    sort(std);
    for(int i=0;i<n;i++)
    {
      scanf("%s",in);
      sort(in);
      if(strcmp(in,std)==0)
      {
        printf("YES\n");
      }
      else
      {
        printf("NO\n");
      }
    }
  }
  return 1;
}

C++解答

#include<iostream>
#include<string>
using namespace std;

 

//递归判断是否是同一棵二叉搜索树

//时间复杂度O(nlogn)

bool is_same(string a,string b)
{
         if(a==b)
            return true;
         if(a[0]!=b[0])
            return false;
         string a1,a2,b1,b2;
         unsigned i;
         for(i=1;i<a.size();i++)
         {
             if(a[i]>a[0])
                 a2+=a[i];
             else
                 a1+=a[i];
            if(b[i]>b[0])
                 b2+=b[i];
            else
                  b1+=b[i];
        }

 if(is_same(a1,b1)&&is_same(a2,b2))
        return true;
 else
        return false;
}

int main()
{
        int m;
       string a,b;
       while(1)
       {
             cin>>m;
            if(m==0)
               break;
           cin>>a;
           for(int j=0;j<m;j++)
          {
                cin>>b;
                if(is_same(a,b))
                     cout<<"YES"<<endl;
                else
                     cout<<"NO"<<endl;
            }
  }
 return 0;
}

Java解答

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	static int[] ftree = new int[11111];
	static int[] stree = new int[11111];

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		while (in.hasNextInt()) {
			int n = in.nextInt();
			if (n == 0)
				break;
			String s = in.next();
			Arrays.fill(ftree,-1);
			for (int i = 0; i < s.length(); i++) {
				int x = s.charAt(i)-'0';
				int j = 1;
				while(ftree[j]!=-1){
					if(x<=ftree[j])
						j = j*2;
					else
						j = j*2+1;
				}
				ftree[j] = x;
			}
			for (int i = 0; i < n; i++) {
				String s1 = in.next();
				Arrays.fill(stree, -1);
				for (int k = 0; k < s1.length(); k++) {
					int x = s1.charAt(k) - '0';
					int j = 1;
					while (stree[j] != -1) {
						if (x <= stree[j])
							j = j * 2;
						else
							j = j * 2 + 1;
					}
					stree[j] = x;
				}
				boolean flag = true;
				for (int k = 0; k < ftree.length; k++) {
					if (ftree[k] != stree[k]) {
						flag = false;
						break;
					}
				}
				if (flag)
					System.out.println("YES");
				else
					System.out.println("NO");
			}
		}
	}
}