91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java怎么實現樹的同構

發布時間:2021-06-22 10:56:10 來源:億速云 閱讀:135 作者:小新 欄目:開發技術

小編給大家分享一下Java怎么實現樹的同構,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

樹的同構

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

舉例

Java怎么實現樹的同構

樹的構造

樹可以由數組或鏈表來構造:
舉例:上圖左上角的樹通過數組可表示為

0123456789101112
ABCDEG---F-H-

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

鏈表方式則比較直觀

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

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

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

數組索引dataleftright
0A12
1B34
2C6-
3D--
4E5-
5F--
6G7-
7H--

本文的樹結構使用了第三種方式

終端輸入:

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);
    }

    //樹結構
    public static class Node{
        String data;
        int left;
        int right;

    }

    /**
     * 創建樹
     * @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;
    }

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

    }


}

以上是“Java怎么實現樹的同構”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

山阴县| 黄冈市| 宜都市| 伊宁县| 美姑县| 常德市| 温州市| 平山县| 新宁县| 墨江| 政和县| 涿州市| 铜川市| 胶州市| 思茅市| 辛集市| 浦江县| 龙川县| 麻栗坡县| 离岛区| 定襄县| 怀宁县| 东乡县| 巩义市| 泌阳县| 林甸县| 诸暨市| 凌源市| 和静县| 礼泉县| 井冈山市| 连云港市| 霍林郭勒市| 景东| 兰考县| 抚顺县| 洱源县| 南阳市| 禄劝| 兴化市| 西峡县|