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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了九度OJ平台练习 —— 题目1009相关的知识,希望对你有一定的参考价值。

技术分享

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

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

我的方法是用静态数组模拟出二叉搜索树,根据二叉搜索树的特性,第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的主要内容,如果未能解决你的问题,请参考以下文章

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

九度OJ-题目1009:二叉搜索树

九度OJ刷题——1009:二叉搜索树

oj---九度oj---1009

九度oj 题目1397:查找数段

九度oj 题目1465:最简真分数