03-树1 树的同构 Java实现

2022-08-11 10:28:50

给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。

图一
图一

图二
图二
现给定两棵树,请你判断它们是否是同构的。

输入格式:
输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数N (≤10),即该树的结点数(此时假设结点从0到N−1编号);随后N行,第i行对应编号第i个结点,给出该结点中存储的1个英文大写字母、其左孩子结点的编号、右孩子结点的编号。如果孩子结点为空,则在相应位置上给出“-”。给出的数据间用一个空格分隔。注意:题目保证每个结点中存储的字母是不同的。

输出格式:
如果两棵树是同构的,输出“Yes”,否则输出“No”。

输入样例1(对应图1):

8
A 1 2
B 3 4
C 5 -
D - -
E 6 -
G 7 -
F - -
H - -
8
G - 4
B 7 6
F - -
A 5 1
H - -
C 0 -
D - -
E 2 -

输出样例1:

Yes

输入样例2(对应图2):

8
B 5 7
F - -
A 0 3
C 6 -
H - -
D - -
G 4 -
E 1 -
8
D 6 -
B 5 -
E - -
H - -
C 0 2
G - 3
F - -
A 1 4

输出样例2:

No

代码如下:

import java.io.BufferedReader;import java.io.FileDescriptor;import java.io.FileReader;/**
 * 判断树是否同构
 */publicclassMain{publicstaticvoidmain(String[] args){
        Main self=newMain();
        BufferedReader br=newBufferedReader(newFileReader(FileDescriptor.in));try{
            Node[] t1= self.readTree(br);
            Node[] t2= self.readTree(br);int root1= self.findRootNode(t1);int root2= self.findRootNode(t2);boolean res= self.isomorphism(t1, root1, t2,root2);if(res){
                System.out.println("Yes");}else{
                System.out.println("No");}}catch(Exception e){
            e.printStackTrace();}}//读取树方法public Node[]readTree(BufferedReader br)throws Exception{//获取节点数int num= Integer.parseInt(br.readLine().trim());
        Node[] tree=newNode[num];for(int i=0; i<num; i++){
            String[] str= br.readLine().trim().split(" ");int left= str[1].equals("-")?-1:Integer.parseInt(str[1]);int right= str[2].equals("-")?-1:Integer.parseInt(str[2]);
            tree[i]=newNode(str[0].trim(),left,right);}return tree;}//查找根节点privateintfindRootNode(Node[] tree){int len= tree.length;int index=-1;int[] check=newint[len];for(int i=0; i< len; i++){int tempLeft= tree[i].getLeft();int tempRight= tree[i].getRight();if(tempLeft!=-1){
                check[tempLeft]=1;}if(tempRight!=-1){
                check[tempRight]=1;}}//查找检查数组为0的下标for(int i=0; i< len; i++){if(check[i]==0){
                index= i;break;}}return index;}//判断是否同构isomorphismpublicstaticbooleanisomorphism(Node[] arr1,int head1, Node[] arr2,int head2){//两个空的树if(head1==-1&& head2==-1)returntrue;//一个空,一个不空if(head1==-1&& head2!=-1|| head1!=-1&& head2==-1)returnfalse;//根节点不相等if(!(arr1[head1].getNode().equals(arr2[head2].getNode()))){returnfalse;}//如果树1.左和树2.左都空,只要比较树1.右和树2.右if((arr1[head1].getLeft()==-1)&&(arr2[head2].getLeft()==-1))returnisomorphism(arr1, arr1[head1].getRight(), arr2, arr2[head2].getRight());//如果树1.左和树2.左都不空,并且值相等,那么比较树1.左和树2.左 && 树1.右和树2.右if(((arr1[head1].getLeft()!=-1)&&(arr2[head2].getLeft()!=-1))&&(arr1[arr1[head1].getLeft()].getNode().equals(arr2[arr2[head2].getLeft()].getNode()))){returnisomorphism(arr1, arr1[head1].getLeft(), arr2, arr2[head2].getLeft())&&isomorphism(arr1, arr1[head1].getRight(), arr2, arr2[head2].getRight());}else{//否则比较 树1.左和树2.右 && 树1.右和树2.左returnisomorphism(arr1, arr1[head1].getLeft(), arr2, arr2[head2].getRight())&&isomorphism(arr1, arr1[head1].getRight(), arr2, arr2[head2].getLeft());}}}classNode{private String node;privateint left;privateint right;publicNode(String node,int left,int right){this.node= node;this.left= left;this.right= right;}public StringgetNode(){return node;}publicvoidsetNode(String node){this.node= node;}publicintgetLeft(){return left;}publicvoidsetLeft(int left){this.left= left;}publicintgetRight(){return right;}publicvoidsetRight(int right){this.right= right;}@Overridepublic StringtoString(){return node+" "+ left+" "+ right;}}
  • 作者:fairydeng
  • 原文链接:https://blog.csdn.net/fairydeng/article/details/88745442
    更新时间:2022-08-11 10:28:50