树的同构

import java.util.*;
class treenode{
 public char val;
 int left;
 int right;
}
public class Main {
 public static int root = -1; //全局变量
 public static treenode[] buildtree(Scanner in){
  treenode[] T = new treenode[10];
  int N = in.nextInt();
        if(N == 0) return null;//空树判断
  int[] check = new int[N];
  for(int i=0;i<N;i++) {
   T[i] = new treenode();//新建结点
   T[i].val = in.next().charAt(0);
   char cl = in.next().charAt(0);//left
   if(cl!='-') {
    T[i].left = cl-'0';
    check[T[i].left]=1;
   }
   else  T[i].left = -1;
   char cr = in.next().charAt(0);//right
   if(cr!='-') {
    T[i].right = cr-'0';
    check[T[i].right]=1;
   }
   else  T[i].right = -1;
   
  }
  int j;
  for(j=0;j<N;j++) {
   if(check[j] == 0) break;
  }
  root = j;
  return T;
  
 }
 static boolean istg(int r1,int r2,treenode[] T1,treenode[] T2 ) {
  if(r1 == -1 && r2 == -1) return true;
  if((r1 == -1 && r2 != -1)||(r2 == -1 && r1 != -1)) return false;
  if(T1[r1].val != T2[r2].val) return false;
  if(T1[r1].left == -1 && T2[r2].left == -1)
   return istg(T1[r1].right,T2[r2].right,T1,T2);
  if(T1[r1].left != -1 && T2[r2].left != -1 && T1[T1[r1].left].val == T2[T2[r2].left].val)
   return (istg(T1[r1].left,T2[r2].left,T1,T2) && istg(T1[r1].right,T2[r2].right,T1,T2));
  else return (istg(T1[r1].left,T2[r2].right,T1,T2) && istg(T1[r1].right,T2[r2].left,T1,T2));
  
  
 }
 public static void main(String[] args) {
  Scanner in = new Scanner(System.in);
  
  treenode[] T1 = buildtree(in);
  int r1 = root;
  treenode[] T2 = buildtree(in);
  int r2 = root;
  if(istg(r1,r2,T1,T2))
  System.out.println("Yes");
  else System.out.println("No");
  
  
 }
}

注意:

只能在main函数里定义scanner in,再传给其他函数,否则会出现读数据出错。

posted on 2019-04-20 15:53  q2013  阅读(80)  评论(0编辑  收藏  举报

导航