中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

使用Java怎么實現樹的同構

發布時間:2022-02-23 10:33:24 來源:億速云 閱讀:160 作者:小新 欄目:開發技術

這篇文章主要介紹使用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,2B,3,-C,-,-D,-,-A,2,1B,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);  //初始化為0for (int i=0;i<N;i++){//輸入格式  data,left,rightString 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

湖南省| 象山县| 望奎县| 开阳县| 城步| 略阳县| 湟中县| 平度市| 连山| 南溪县| 柳河县| 哈巴河县| 陆河县| 盐城市| 会东县| 阿荣旗| 长汀县| 桃源县| 香格里拉县| 汝阳县| 隆子县| 台南市| 东宁县| 浦江县| 吉安县| 常宁市| 鄄城县| 西华县| 莒南县| 浮梁县| 徐汇区| 孙吴县| 台东县| 文山县| 万安县| 太保市| 宜宾县| 滕州市| 扶风县| 安丘市| 无为县|