码迷,mamicode.com
首页 > 其他好文 > 详细

九度OJ平台练习 —— 题目1009

时间:2016-05-16 21:29:50      阅读:1189      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

这道题目不是很简单,第一反应可能是真的去构造出一棵树,然后递归遍历,比较两棵树的每个结点是否相同。

但这样子很麻烦,而且递归遍历的效率不高,我看到很多人用递归的方法最后超时无法通过。

我的方法是用静态数组模拟出二叉搜索树,根据二叉搜索树的特性,第i个节点的左孩子是第2*i个节点,右孩子是第2*i+1个节点,我们可以很方便地计算出每个节点的下标。

Java代码如下:

import java.util.*;
public class Main{
    public static void main(String args[]){
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            int n = Integer.parseInt(in.nextLine());
            if(n == 0)break;
            int a[] = new int[512];
            int b[] = new int[512];
            String s = in.nextLine();
            createTree(a,s);
            while(n > 0){
                n--;
                String t = in.nextLine();
                createTree(b,t);
                int i;
                for(i = 0; i < 512; i++){
                    if(a[i] != b[i]) break;
                }
                if(i == 512){
                    System.out.println("YES");
                }
                else{ 
                    System.out.println("NO");
                }
            }
        }
        in.close();
    }
//这是核心函数,数组模拟一棵二叉搜索树
public static void createTree(int a[],String s){
     //先把数组都初始化为-1
for(int i = 0; i < 512; i++) a[i] = -1;
     //s是序列,我们要根据s构造出一棵树,先遍历s,每个字符对应一个节点
for(int i = 0; i < s.length(); i++){
       //获得要添加的节点的数值temp
int temp = s.charAt(i)-‘0‘;
       //遍历数组,也即遍历二叉树
for(int j = 1; j < 512;){ //注意这里没有j++
          //如果a[j]==-1,那么这个节点是空的,直接把temp存进去
if(a[j] == -1){ a[j] = temp; break; }
         //如果不是空的,那么要往下找它的孩子节点,根据二叉搜索树的性质
          //如果temp<a[j],那么temp应该在a[j]的左子树里,j=2*j接着遍历左子树
          //如果temp>=a[j],那么temp应该在a[j]的右子树里,j=2*j+1,接着遍历右子树
else if(a[j] > temp) j = 2*j; else j = 2*j+1; } } } }

 

九度OJ平台练习 —— 题目1009

标签:

原文地址:http://www.cnblogs.com/mudao/p/5499418.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!