华为机试题 二叉查搜索树 判断两序列是否为同一二叉搜索树序列

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

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

接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。

接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。

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

样例输入:
2
567432
543267
576342
0
样例输出:
YES
NO

本题思路:根据初始目标序列,构建二叉搜索树,判断每个序列是否相同,设置俩个计数cl和cr, 从根节点开始,分别表示小于或者大于 head.data的次数,就为每个字符串中某个字符在二查搜索树中查找的次数。

看别人更好的思路:假设为完全二叉树,用数组来表示,插入到2i和2i+1的位置。附上一段核心代码

  1 //判断两序列是否为同一二叉搜索树序列
  2 /*
  3 2
  4 567432
  5 543267
  6 576342
  7 如果序列相同则输出YES,否则输出NO
  8  * */
  9
 10 //本题解决思路,构建目标二叉排序树,对所有测试串,逐一逐位进行比较
 11 //更好的思路: 用数组模拟二叉排序树,构建“全二叉树”不存在的点为-1,对每个比较串,同样构建一个数组,最后俩俩比较数组即可。
 12 /*
 13  void createtree(string s, int c[])
 14 {
 15     int len = s.length();
 16     for (int i = 0; i < len; i++)
 17     {
 18         int temp = s[i] - ‘0‘;
 19         for (int j = 1; j <= 1023;)
 20         {
 21             if (c[j] == -1)
 22             {
 23                 c[j] = temp; break;
 24             }
 25             else if (c[j]>temp)
 26                 j = j * 2;
 27             else
 28             {
 29                 j = j * 2 + 1;
 30             }
 31         }
 32     }
 33 }
 34  */
 35 import java.util.Scanner;
 36
 37 public class isBinarySortTree {
 38     public static void judge(String[] s, int n) {
 39
 40         Node head = null;
 41         Node pre = null;
 42         for (int k = 0; k < s[0].length(); k++) {
 43             Node node = new Node(s[0].charAt(k) - ‘0‘);
 44             if (head == null) {
 45                 head = node;
 46             } else {
 47                 pre = head;
 48                 while (true) {
 49                     if (node.data < pre.data) {
 50                         if (pre.l == null) {
 51                             pre.l = node;
 52                             break;
 53                         } else {
 54                             pre = pre.l;
 55                         }
 56                     } else if (node.data == pre.data) {
 57                         break;
 58                     } else {
 59                         if (pre.r == null) {
 60                             pre.r = node;
 61                             break;
 62                         } else {
 63                             pre = pre.r;
 64                         }
 65                     }
 66                 }
 67             }
 68         }
 69
 70
 71         for (int i = 1; i <= n; i++) {
 72             int cl = 0, cr = 0;// 记录左右 大于或者小于head的次数,就为左右查找比较的次数
 73             int cll = 0, crr = 0;
 74             int data = 0;
 75             int flag=0;
 76             if ( (s[i].charAt(0) - ‘0‘)!= head.data) {
 77                 System.out.println("NO");
 78                 continue;
 79             }
 80             for (int k = 0; k < s[i].length(); k++) {
 81                 data = s[i].charAt(k) - ‘0‘;
 82                 pre = head;
 83                 if (data == head.data) {
 84                     continue;
 85                 } else if (data < head.data) {
 86                     cl++;
 87                 } else {
 88                     cr++;
 89                 }
 90                 cll = cl;
 91                 crr = cr;
 92                 while (true) {
 93                     if (data < head.data) {
 94                         while (cll >= 0) {
 95                             if (data == pre.data) {
 96                                 break;
 97                             } else if (data < pre.data) {
 98                                 pre = pre.l;
 99
100                             } else {
101                                 pre = pre.r;
102                             }
103                             cll--;
104                         }
105                         if (cll < 0) {// NO
106                             flag=1;
107                         }
108                         break;
109                     }
110                     if (data > head.data) {
111                         while (crr >= 0) {
112                             if (data == pre.data) {
113                                 break;
114                             } else if (data > pre.data) {
115                                 pre = pre.r;
116                             } else {
117                                 pre = pre.l;
118                             }
119                             crr--;
120                         }
121                         if (crr < 0) {// NO
122                             flag=1;
123                         }
124                         break;
125                     }
126                 }
127
128
129             }//每一个串比较结束
130             if(flag==0){
131                 System.out.println("YES");
132             }else{
133                 System.out.println("NO");
134             }
135         }
136
137     }
138
139     public static void main(String[] args) {
140         Scanner sc = new Scanner(System.in);
141         int n = sc.nextInt();
142         String s[] = new String[n + 1];
143         int i = 0;
144         while (i <= n) {
145
146             s[i++] = sc.next();
147         }
148         judge(s, n);
149
150     }
151 }
152
153 class Node {
154     int data;
155     Node l = null;
156     Node r = null;
157
158     Node(int data) {
159         this.data = data;
160     }
161 }
时间: 2024-08-07 23:08:51

华为机试题 二叉查搜索树 判断两序列是否为同一二叉搜索树序列的相关文章

数据结构与算法问题 判断两序列是否为同一二叉搜索树序列

题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树. 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树. 输出: 如果序列相同则输出YES,否则输出NO 样例输入: 2 567432 543267 576342 0 样例输出: YES NO 来源:

华为机试题 -- 明明的随机数

题目描述 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号.然后再把这些数从小到大排序,按照排好的顺序去找同学做调查.请你协助明明完成"去重"与"排序"的工作. Input Param n               输入随机数的个数 inputArray      n个随机整数组成的数组 Return V

[华为机试真题][2014]64.实现两个合法时间相加

题目 描述: 给定两个合法的时间(格式固定:hh:mm:ss,时间合法,不用考虑其它情况),输入两个时间相加后的结果:注意,相加后的结果也必需是一个合法的时间: 附合法时间定义:小时在[00-23]之间,分钟和秒分别是在[00-59]之间: 运行时间限制: 无限制 内存限制: 无限制 输入: 时分秒格式的时间字符串,如00:00:00 输出: 时分秒格式的时间字符串,如00:00:00 样例输入: 00:00:00 00:00:01 样例输出: 00:00:01 答案提示: 建议将时间转换为秒数

华为机试题【12】-关灯泡

题目描述: 描述: 一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1.2.3.-n-1.n.每盏电灯由一个拉线开关控制.开始,电灯全部关着. 有n个学生从长廊穿过.第一个学生把号码凡是1的倍数的电灯的开关拉一下:接着第二个学生把号码凡是2的倍数的电灯的开关拉一下:接着第三个学生把号码凡是3的倍数的电灯的开关拉一下:如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下.n个学生按此规定走完后,长廊里电灯有几盏亮着. 注:电灯数和学生数一致. 运行时间限制: 无限

华为机试题【1】

题目描述: 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. 输入描述: 输入包括多组测试数据. 每组输入第一行是两个正整数N和M(0 < N <= 30000,0 < M < 5000),分别代表学生的数目和操作的数目. 学生ID编号从1编到N. 第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩 接下来又M行,每一行有一个字符C(只取'Q'或'U'),和两个正整数A,B,当C为'Q'

华为机试题【10】-求数字基root

题目描述: 求整数的Root:给定正整数,求每位数字之和;如果和不是一位数,则重复; 输入:输入任意一个或多个整数 输出:输出各位数字之和,直到和为个位数为止(输入异常,则返回-1),多行,每行对应一个输入数据的结果. 样例输入: 25 865 样例输出: 7 1 思路分析: 首先求个位数相加,经典方法,求余相除 要求各个位数的和是小于10,可以采用递归或者循环 代码: import java.util.Scanner; public class Main { static int[] num

华为机试题【11】-报数删除人

题目描述: 有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出,问最后留下的那位是原来第几号. 思路分析: 首先是选好数据结构,轻量级的boolean数组,下边代表序号,全部初始化位true 退出变为false,设置全局变量int a,遍历数组,a++(当对应为false时候,continue跳过) 遍历数组统计true的数量,为1时候退出 注意: 如果要用List来存储,注意遍历remove删除时候,要一致,不能list和iterator混用 代码: import

华为机试题【3】

题目: 扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A,2各4张,小王1张,大王1张.牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王):) 3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER 输入两手牌,两手牌之间用"-"连接,每手牌的每张牌以空格分隔,"-"两边没有空格,如:4 4 4 4-joker JOKER 请比较两手牌大小,输出较大的牌,如果不存在比较关系则输出ERROR 基

2017华为机试题--水仙花数

等了一个月终于等到华为给安排的实习生在线机试,把自己做的三道题记录了一下,也方便日后复习.这篇是第一题,没有什么特别的难度,经典的水仙花数题. 题目描述:水仙花数是指一个n位数(n≥3),它的每个位上的数字的n次幂之和等于它本身.(例如:13+53+33=153),要求:输出1000范围内所有水仙花数及水仙花数之和. 输入描述:无 输出描述:1000以内所有水仙花数及总和. 输出例子: 第1个水仙花数:xxx 第2个水仙花数:xxx 第3个水仙花数:xxx ... 水仙花数总和为:xxx 1 p