最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java如何實現(xiàn)樹的同構(gòu)?

 更新時間:2021年06月22日 09:22:42   作者:dztom  
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著Java如何實現(xiàn)樹的同構(gòu)展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下

樹的同構(gòu)

備忘!
定義:給定兩棵樹r1、r2,如果r1可以通過若干次的左子樹和右子樹互換,使之與r2完全相同,這說明兩者同構(gòu)。

舉例

在這里插入圖片描述

樹的構(gòu)造

樹可以由數(shù)組或鏈表來構(gòu)造:
舉例:上圖左上角的樹通過數(shù)組可表示為

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

該方式浪費了部分空間,但適合表示完全二叉樹

鏈表方式則比較直觀

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

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

舉例:上圖左上角的樹可表示為

數(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 - -

本文的樹結(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);
    }

    //樹結(jié)構(gòu)
    public static class Node{
        String data;
        int left;
        int right;

    }

    /**
     * 創(chuàng)建樹
     * @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){
        //須注意不要漏掉邏輯!
        
        //兩個根節(jié)點均為null,必同構(gòu)
        if ((r1 == -1) && (r2 == -1)) {
            return true;
        }
        //一個非空 另一個空,必不同構(gòu)
        if(((r1==-1)&&(r2!=-1))||((r1!=-1)&&(r2==-1))){
            return false;
        }
        //兩個節(jié)點非空 但值不同,必不同構(gòu)
        if(!t1[r1].data.equals(t2[r2].data)){
            return false;
        }
        //兩根節(jié)點的左孩子為空條件下,則須判斷兩根節(jié)點的右子樹是否同構(gòu)
        if(t1[r1].left==-1&&t2[r2].left==-1){
            return isomorphic(t1[r1].right,t2[r2].right,t1,t2);
        }
        //兩根節(jié)點的左孩子不為空且左孩子的值也相同,須判斷兩根節(jié)點的左子樹是否同構(gòu)以及兩根節(jié)點的右子樹是否同構(gòu)
        //如果左右子樹均同構(gòu),則整棵樹同構(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é)點的左孩子不為空,但左孩子的值不同
            //例如: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的左子樹與r2的右子樹同構(gòu)、r1的右子樹與r2的左子樹同構(gòu)
            //故須判斷r1的左子樹是否與r2的右子樹同構(gòu),以及r1的右子樹是否與r2的左子樹同構(gòu)
            //2、兩根節(jié)點的左孩子一個為空,一個不為空
            //例如:r1.left==-1、r2.left!=-1,如果r2.right==-1,顯然r1的左子樹與r2的右子樹同構(gòu),此時則有可能r1的右子樹與r2的左子樹同構(gòu)
            //故須判斷r1的左子樹是否與r2的右子樹同構(gòu),以及r1的右子樹是否與r2的左子樹同構(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);

    }


}

到此這篇關(guān)于Java如何實現(xiàn)樹的同構(gòu)?的文章就介紹到這了,更多相關(guān)Java實現(xiàn)樹的同構(gòu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java三種方法將List轉(zhuǎn)換為Map的實例

    Java三種方法將List轉(zhuǎn)換為Map的實例

    今天小編就為大家分享一篇關(guān)于Java三種方法將List轉(zhuǎn)換為Map的實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • 解析Java并發(fā)Exchanger的使用

    解析Java并發(fā)Exchanger的使用

    Exchanger是java 5引入的并發(fā)類,Exchanger顧名思義就是用來做交換的。這里主要是兩個線程之間交換持有的對象。當Exchanger在一個線程中調(diào)用exchange方法之后,會等待另外的線程調(diào)用同樣的exchange方法。兩個線程都調(diào)用exchange方法之后,傳入的參數(shù)就會交換。
    2021-06-06
  • java中i = i++和i =++i的深入講解

    java中i = i++和i =++i的深入講解

    這篇文章主要介紹了java中i = i++和i =++i的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Java源碼解析之ConcurrentHashMap

    Java源碼解析之ConcurrentHashMap

    今天帶大家分析Java源碼,文中對Java ConcurrentHashMap介紹的非常詳細,有代碼示例,對正在學(xué)習(xí)Java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • Java中二叉樹的建立和各種遍歷實例代碼

    Java中二叉樹的建立和各種遍歷實例代碼

    這篇文章主要介紹了Java中二叉樹的建立和各種遍歷實例代碼,涉及樹節(jié)點的定義,后序遍歷,層序遍歷,深度優(yōu)先和廣度優(yōu)先等相關(guān)內(nèi)容,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • java實現(xiàn)簡易版圖形界面計算器

    java實現(xiàn)簡易版圖形界面計算器

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡易版圖形界面計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 如何使用jenkins實現(xiàn)發(fā)布部分更新文件

    如何使用jenkins實現(xiàn)發(fā)布部分更新文件

    這篇文章主要介紹了如何使用jenkins實現(xiàn)發(fā)布部分更新文件,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • Spring Boot與RabbitMQ結(jié)合實現(xiàn)延遲隊列的示例

    Spring Boot與RabbitMQ結(jié)合實現(xiàn)延遲隊列的示例

    本篇文章主要介紹了Spring Boot與RabbitMQ結(jié)合實現(xiàn)延遲隊列的示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • spring framework體系結(jié)構(gòu)及模塊jar依賴關(guān)系詳解

    spring framework體系結(jié)構(gòu)及模塊jar依賴關(guān)系詳解

    在本篇文章里小編給大家整理的是關(guān)于spring framework體系結(jié)構(gòu)及模塊jar依賴關(guān)系,對此有興趣的朋友們可以學(xué)習(xí)下。
    2019-09-09
  • Java 基礎(chǔ)詳解(泛型、集合、IO、反射)

    Java 基礎(chǔ)詳解(泛型、集合、IO、反射)

    下面小編就為大家?guī)硪黄狫ava 基礎(chǔ)詳解(泛型、集合、IO、反射)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10

最新評論

泰来县| 镇坪县| 青岛市| 桐庐县| 福清市| 徐水县| 万盛区| 安平县| 大邑县| 建平县| 雷山县| 铜鼓县| 琼结县| 陈巴尔虎旗| 达州市| 溧阳市| 竹山县| 江孜县| 桃园市| 陈巴尔虎旗| 高台县| 牡丹江市| 昌都县| 桓仁| 东明县| 新源县| 新宾| 清苑县| 将乐县| 安庆市| 宜章县| 临武县| 咸宁市| 兴宁市| 武宣县| 怀集县| 泌阳县| 桐乡市| 顺平县| 康乐县| 洞口县|