欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

帶你用Java方法輕松實(shí)現(xiàn)樹(shù)的同構(gòu)

 更新時(shí)間:2021年06月23日 17:35:58   作者:dztom  
給定兩棵樹(shù)T1和T2。如果T1可以通過(guò)若干次左右孩子互換就變成T2,則我們稱兩棵樹(shù)是“同構(gòu)”的。例如圖1給出的兩棵樹(shù)就是同構(gòu)的,因?yàn)槲覀儼哑渲幸豢脴?shù)的結(jié)點(diǎn)A、B、G的左右孩子互換后,就得到另外一棵樹(shù)

樹(shù)的同構(gòu)

舉例

在這里插入圖片描述

樹(shù)的構(gòu)造

樹(shù)可以由數(shù)組或鏈表來(lái)構(gòu)造:

舉例:上圖左上角的樹(shù)通過(guò)數(shù)組可表示為

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

該方式浪費(fèi)了部分空間,但適合表示完全二叉樹(shù)

鏈表方式則比較直觀

除上述兩種方式外,還可以采用“類數(shù)組”的方式

 public static class Node{
        String data;
        int left;
        int right;
         }

舉例:上圖左上角的樹(shù)可表示為

數(shù)組索引 data left right
0 A 1 2
1 B 3 4
2 C 6 -
3 D - -
4 E 5 -
5 F - -
6 G 7 -
7 H - -

本文的樹(shù)結(jié)構(gòu)使用了第三種方式

終端輸入:

A,1,2
B,3,-
C,-,-
D,-,-
A,2,1
B,3,-
C,-,-
D,-,-
public class TongGou {
    private Scanner scanner;
    public TongGou(){
        scanner = new Scanner(System.in);
    }
    //樹(shù)結(jié)構(gòu)
    public static class Node{
        String data;
        int left;
        int right;
    }
    /**
     * 創(chuàng)建樹(shù)
     * @param nodes
     * @return
     */
    public int createTree(Node[] nodes){
        int N = nodes.length;
        int root = -1;
        int[] check = new int[N];
        Arrays.fill(check,0);  //初始化為0
        for (int i=0;i<N;i++){
            //輸入格式  data,left,right
            String next = scanner.next();
            String[] inputList = next!=null?next.split(","):null;
            if(inputList!=null&&inputList.length==3){
                nodes[i] = new Node();
                int  left = "-".equals(inputList[1])?-1:Integer.parseInt(inputList[1]);
                int  right = "-".equals(inputList[2])?-1:Integer.parseInt(inputList[2]);
                nodes[i].data = inputList[0];
                nodes[i].left = left;
                nodes[i].right = right;
                if(left>0) {
                    check[left] = 1;
                }
                if(right>0){
                    check[right] = 1;
                }
            }
        }
        for(int i=0;i<check.length;i++){
            if(check[i]==0&&nodes[i].data!=null){
                root = i;
                break;
            }
        }
        return root;
    }
    /**
     * 判斷同構(gòu)
     * @param r1
     * @param r2
     * @return
     */
    public boolean isomorphic(int r1,int r2,Node[] t1,Node[] t2){
        //須注意不要漏掉邏輯!
        //兩個(gè)根節(jié)點(diǎn)均為null,必同構(gòu)
        if ((r1 == -1) && (r2 == -1)) {
            return true;
        }
        //一個(gè)非空 另一個(gè)空,必不同構(gòu)
        if(((r1==-1)&&(r2!=-1))||((r1!=-1)&&(r2==-1))){
            return false;
        }
        //兩個(gè)節(jié)點(diǎn)非空 但值不同,必不同構(gòu)
        if(!t1[r1].data.equals(t2[r2].data)){
            return false;
        }
        //兩根節(jié)點(diǎn)的左孩子為空條件下,則須判斷兩根節(jié)點(diǎn)的右子樹(shù)是否同構(gòu)
        if(t1[r1].left==-1&&t2[r2].left==-1){
            return isomorphic(t1[r1].right,t2[r2].right,t1,t2);
        }
        //兩根節(jié)點(diǎn)的左孩子不為空且左孩子的值也相同,須判斷兩根節(jié)點(diǎn)的左子樹(shù)是否同構(gòu)以及兩根節(jié)點(diǎn)的右子樹(shù)是否同構(gòu)
        //如果左右子樹(shù)均同構(gòu),則整棵樹(shù)同構(gòu)
        if((t1[r1].left!=-1&&t2[r2].left!=-1)&&(t1[t1[r1].left].data.equals(t2[t2[r2].left].data))){
            return isomorphic(t1[r1].left,t2[r2].left,t1,t2)&&isomorphic(t1[r1].right,t2[r2].right,t1,t2);
        }else{
            //分兩種情況解釋:
            //1、兩根節(jié)點(diǎn)的左孩子不為空,但左孩子的值不同
            //例如:t1[r1.left].data!=t2[r2.left].data。但有t1[r1.left].data==t2[r2.right].data、t1[r1.right].data==t2[r2.left].data
            //即有可能r1的左子樹(shù)與r2的右子樹(shù)同構(gòu)、r1的右子樹(shù)與r2的左子樹(shù)同構(gòu)
            //故須判斷r1的左子樹(shù)是否與r2的右子樹(shù)同構(gòu),以及r1的右子樹(shù)是否與r2的左子樹(shù)同構(gòu)
            //2、兩根節(jié)點(diǎn)的左孩子一個(gè)為空,一個(gè)不為空
            //例如:r1.left==-1、r2.left!=-1,如果r2.right==-1,顯然r1的左子樹(shù)與r2的右子樹(shù)同構(gòu),此時(shí)則有可能r1的右子樹(shù)與r2的左子樹(shù)同構(gòu)
            //故須判斷r1的左子樹(shù)是否與r2的右子樹(shù)同構(gòu),以及r1的右子樹(shù)是否與r2的左子樹(shù)同構(gòu)
            return isomorphic(t1[r1].left,t2[r2].right,t1,t2)&&isomorphic(t1[r1].right,t2[r2].left,t1,t2);
        }
    }
    public static void main(String[] args) {
        TongGou tongGou = new TongGou();
        Node[] nodes = new Node[4];
        Node[] nodes1 = new Node[4];
        int tree1 = tongGou.createTree(nodes);
        System.out.println();
        int tree2 = tongGou.createTree(nodes1);
        boolean isomorphic = tongGou.isomorphic(tree1, tree2, nodes, nodes1);
        System.out.println(isomorphic);
    }

}

總結(jié)

本篇文章的內(nèi)容就到這了,希望大家可以喜歡,也希望大家可以多多關(guān)注腳本之家的其他精彩內(nèi)容!

相關(guān)文章

  • Java四位電話號(hào)碼的加密方法

    Java四位電話號(hào)碼的加密方法

    這篇文章主要為大家詳細(xì)介紹了Java四位電話號(hào)碼的加密方法,數(shù)據(jù)是四位的整數(shù),在傳遞過(guò)程中進(jìn)行加密,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Java依賴-關(guān)聯(lián)-聚合-組合之間區(qū)別_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java依賴-關(guān)聯(lián)-聚合-組合之間區(qū)別_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了Java依賴-關(guān)聯(lián)-聚合-組合之間區(qū)別理解,依賴關(guān)系比較好區(qū)分,它是耦合度最弱的一種,下文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2017-08-08
  • Java使用Servlet生成驗(yàn)證碼圖片

    Java使用Servlet生成驗(yàn)證碼圖片

    這篇文章主要為大家詳細(xì)介紹了Java使用Servlet生成驗(yàn)證碼圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • eclipse配置javap命令的方法

    eclipse配置javap命令的方法

    本篇文章主要介紹了如何為eclipse配置javap命令,在配置過(guò)程中會(huì)出現(xiàn)的小問(wèn)題的解決方法,非常實(shí)用,需要的朋友可以參考下
    2015-07-07
  • Java web Hibernate如何與數(shù)據(jù)庫(kù)鏈接

    Java web Hibernate如何與數(shù)據(jù)庫(kù)鏈接

    這篇文章主要介紹了Java web Hibernate如何與數(shù)據(jù)庫(kù)鏈接,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • springboot打印接口調(diào)用日志的實(shí)例

    springboot打印接口調(diào)用日志的實(shí)例

    這篇文章主要介紹了springboot打印接口調(diào)用日志的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Springboot下RedisTemplate的兩種序列化方式實(shí)例詳解

    Springboot下RedisTemplate的兩種序列化方式實(shí)例詳解

    這篇文章主要介紹了Springboot下RedisTemplate的兩種序列化方式,通過(guò)定義一個(gè)配置類,自定義RedisTemplate的序列化方式,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • 將springboot項(xiàng)目生成可依賴的jar并引入到項(xiàng)目中的方法

    將springboot項(xiàng)目生成可依賴的jar并引入到項(xiàng)目中的方法

    SpringBoot項(xiàng)目默認(rèn)打包的是可運(yùn)行jar包,也可以打包成不可運(yùn)行的jar包,本文給大家介紹將springboot項(xiàng)目生成可依賴的jar并引入到項(xiàng)目中的方法,感興趣的朋友一起看看吧
    2023-11-11
  • 解決SpringMVC項(xiàng)目連接RabbitMQ出錯(cuò)的問(wèn)題

    解決SpringMVC項(xiàng)目連接RabbitMQ出錯(cuò)的問(wèn)題

    這篇文章主要介紹了解決SpringMVC項(xiàng)目連接RabbitMQ出錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • 詳解Java中如何使用日志庫(kù)在代碼中添加日志

    詳解Java中如何使用日志庫(kù)在代碼中添加日志

    這篇文章主要為大家介紹了Java中如何使用日志庫(kù)在代碼中添加日志詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07

最新評(píng)論