1. 程式人生 > >(2016秋資料結構課後練習題總結)03-樹1 樹的同構 (25分)

(2016秋資料結構課後練習題總結)03-樹1 樹的同構 (25分)

給定兩棵樹T1和T2。如果T1可以通過若干次左右孩子互換就變成T2,則我們稱兩棵樹是“同構”的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點A、B、G的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。


圖1


圖2

現給定兩棵樹,請你判斷它們是否是同構的。

輸入格式:

輸入給出2棵二叉樹樹的資訊。對於每棵樹,首先在一行中給出一個非負整數NNN (≤10\le 1010),即該樹的結點數(此時假設結點從0到N−1N-1N1編號);隨後NNN行,第iii行對應編號第iii個結點,給出該結點中儲存的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

這道理有兩個陣列分別用來儲存結點結構,這樣更加利於操作,一個數組檢查對應的結點是否被其他結點引用,如果被引用,則將對應陣列的下標值設為1,反正為0,最後為0的那個就是樹的根結點的陣列索引。

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

class TreeNode{
    String val;
    int left;
    int right;
}
public class Main {

    private static TreeNode[] T1 = new TreeNode[15];
    private static TreeNode[] T2 = new TreeNode[15];
    private static int[] check = new int[15];
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scan = new Scanner(System.in);
        int T = scan.nextInt();
        Arrays.fill(check, 0);
        for(int i=0;i<T;i++){
//            System.out.println(treeNode.length);
            T1[i] = new TreeNode();
            T1[i].val = scan.next();
            String left = scan.next();
            String right = scan.next();
            if(left.equals("-")){
                T1[i].left = -1;
            }else{
                T1[i].left = Integer.parseInt(left);
                check[Integer.parseInt(left)] = 1;
            }
            
            if(right.equals("-")){
                T1[i].right = -1;
            }else{
                T1[i].right = Integer.parseInt(right);
                check[Integer.parseInt(right)] = 1;
            } 
        }
        
        int root = -1;
        for(int i=0;i<T;i++){
            if(check[i]==0){
                root = i;
            }
        }
        
        T = scan.nextInt();
        Arrays.fill(check, 0);
        for(int i=0;i<T;i++){
            T2[i] = new TreeNode();
            T2[i].val = scan.next();
            String left = scan.next();
            String right = scan.next();
            if(left.equals("-")){
                T2[i].left = -1;
            }else{
                T2[i].left = Integer.parseInt(left);
                check[Integer.parseInt(left)] = 1;
            }
            
            if(right.equals("-")){
                T2[i].right = -1;
            }else{
                T2[i].right = Integer.parseInt(right);
                check[Integer.parseInt(right)] = 1;
            } 
        }
        
        int root1 = -1;
        for(int i=0;i<T;i++){
            if(check[i]==0){
                root1 = i;
            }
        }
        System.out.println(an(root,root1)?"Yes":"No");
    }
    
    //傳遞進來root的索引值可以避免陣列越界
    public static boolean an(int root1,int root2){
//        System.out.println(root1+","+root1.val);
//        System.out.println(root2+","+root2.val);
        if(root1==-1&&root2==-1){
//            System.out.println("1");
            return true;
        }
        if((root1==-1&&root2!=-1)||(root1!=-1&&root2==-1)||(!T1[root1].val.equals(T2[root2].val))){
//            System.out.println("2");
            return false;
        }
        if(T1[root1].left==-1&&T2[root2].left==-1){
//            System.out.println("3");
            return an(T1[root1].right,T2[root2].right);
        }
        if((T1[root1].left!=-1&&T2[root2].left!=-1)&&T1[T1[root1].left].val.equals(T2[T2[root2].left].val)){
//            System.out.println("4");
            return (an(T1[root1].left,T2[root2].left)&&an(T1[root1].right,T2[root2].right));
        }else{
//            System.out.println("5");
            return (an(T1[root1].left,T2[root2].right)&&an(T1[root1].right,T2[root2].left));
        }
    }
}

(2016秋資料結構課後練習題總結)03-樹1 樹的同構   (25分)

相關推薦

(2016資料結構課後練習題總結)03-2 List Leaves (25)

Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. Input Specification: Each input file contains one test

(2016資料結構課後練習題總結)03-1 (25)

給定兩棵樹T1和T2。如果T1可以通過若干次左右孩子互換就變成T2,則我們稱兩棵樹是“同構”的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點A、B、G的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。 圖1 圖2 現給定兩棵樹,請你判斷它們是否是

資料結構與演算法總結——二叉查詢及其相關操作

我實現瞭如下操作 插入,查詢,刪除,最大值 樹的高度,子樹大小 二叉樹的範圍和,範圍搜尋 樹的前序,中序,後序三種遍歷 rank 前驅值 在這一版本的程式碼中,我使用了類模板將介面與實現分

PTA 資料結構與演算法題目集(中文)5-3 (25)

#include <stdio.h> #include <string.h> /* 題目以26個大寫字母為結點值,可以建立一個26*2的二維陣列 表示結點以及結點的左右結點 若只有一個結點,則判斷兩根是否相同 若有多節點,則先將前一棵樹的結點的左右結

03-1 (25)

給定兩棵樹T1和T2。如果T1可以通過若干次左右孩子互換就變成T2,則我們稱兩棵樹是“同構”的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點A、B、G的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。 圖1 圖2 現給定兩棵樹,請你判斷它們是否是同構的。 輸入格式:

中國大學MOOC-陳越、何欽銘-資料結構-2018 03-1 25

給定兩棵樹T1和T2。如果T1可以通過若干次左右孩子互換就變成T2,則我們稱兩棵樹是“同構”的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點A、B、G的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。 圖1 圖2 現給定兩棵樹,請你判

中國大學MOOC-陳越、何欽銘-資料結構-2018 03-2 List Leaves (25

Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. Input Specification: Each input file

資料結構課後練習

就保平佈置的那個必做題。。。 題目:在一個按值遞增的連結串列中刪除值等於x的節點,成功返回1,失敗返回0. 原始碼如下: #include<iostream> #include<stdlib.h> using namespace std; class node {

【極客時間】資料結構與演算法總結

【極客時間】資料結構與演算法總結: 02| 資料結構是為演算法服務的,演算法要作用在特定的資料結構之上。 20個最常用的最基礎的資料結構與演算法: 10個數據結構:陣列、連結串列、棧、佇列、散列表、二叉樹、堆、跳錶、圖、Trie樹 10個演算法:遞迴、排序、二分

leetcode與資料結構---動態規劃總結(一)

這幾天一直在做leetcode上關於動態規劃方面的題目,雖然大二下的演算法設計課上較為詳細的講過動態規劃,奈何遇到新穎的題目或者稍加背景的題目立刻就原形畢露不知題目所云了。動態規劃算是較難的一個專題了,但只要找到遞推關係其最終的程式碼又相當簡便。現在把這幾天做過的題目整理總結一下,畢竟只求做

資料結構課後習題答案_基礎題1

#include<stdio.h> #include<stdlib.h> struct LinearList { int *list; int size; int MaxSize; }; typedef struct LinearList LIST; void Init

資料結構課後習題答案(P195)_第二題。

要求以較高的效率實現刪除線性表中元素值在x~y(x和y自定)之間的所有元素。 #include<stdio.h> #include<stdlib.h> #define X 10 #define Y 30 #define N 20 int A[N]={2,5,15,30,

資料結構與演算法總結——常見排序演算法(未完待續)

本文包含的排序演算法 氣泡排序 插入排序 選擇排序 歸併排序 快速排序 希爾排序 堆排序 桶排序 基數排序 本文關於C++ 的知識點 儘量使用vector代

java常用資料結構基礎知識總結(二)

     在上一篇中,和大家交流了java常用資料結構的基礎知識。現在與大家分享各類資料結構的遍歷問題、轉換問題。 一、遍歷問題 (1) List的遍歷問題(以ArrayList為例) ①通過迭代器遍歷     public static void traverseArr

資料結構排序演算法總結

Sort.h #pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h> typedef int DataType; typedef int (*Pcomp

資料結構-圖-知識點總結

一、基本術語 圖(graph):圖是由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為:G(V,E),其中,G表示一個圖,V是圖G中的頂點的集合,E是圖G中邊的集合。 頂點(Vertex):圖中的資料元素。線性表中我們把資料元素叫元素,樹中將資料元素叫結點。 邊:頂點之間的邏輯關係用邊來表示,邊集可

PTA 中國大學MOOC-陳越、何欽銘-資料結構-2018 05-8 File Transfer (25 ) 並查集

We have a network of computers and a list of bi-directional connections. Each of these connections allows a file transfer from one compute

10.18資料結構的相關總結

關於c++(2016-) 預設值的定義問題 下列函式引數預設值定義錯誤的是( )。 A.f(int x,int y=O) B.fun(int x=100) C.f(int x=0,int y) D.fun(int x=f())(函式f()已經定義) Answe

資料結構查詢章節總結之一

查詢章節總結之一 1.前言 花了一上午的時間來從頭開始學習查詢,來總結下自己所學到的一點點東西。 2.關於靜態查詢表 就是很簡單的陣列的線性查詢,需要從頭開始一個個去找(即為遍歷)那麼這種查詢方法的平均查詢長度在查詢概率相同的情況下為

20172328 2018-2019-1《程式設計與資料結構》課程總結(第2學期課程總結與回顧)

20172328 2018-2019-1《程式設計與資料結構》課程總結 FROM->>TO: How are you? 2018年9月9日->>2018年12月16日: Great! 本學期的程式資料和資料結構課程到這裡就告一段落了,接下來就讓我們一同回顧這學期