PTA 03-树1 树的同构 (25分) java

给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。

具体题目:

PTA | 程序设计类实验辅助教学平台

此题可以从父子节点来入手,当然首先得判断节点数量是否一致。

其次可以判断每棵树节点的子节点或每棵树节点的父节点来比较(通俗一点来说就是,这两棵树中,任意节点的父节点或子节点都需要一致)

以下是代码以子节点为例,思路是,先遍历第一个list,获取字母“A”,同时找到子节点字母“B”,“C”;然后在list2中找到字母“A”,同样也找到子节点。比较是否一致

如此循环,若所有节点的子节点都一致,则说明是同一个棵树

    public static Boolean t2() {
        List<String> list = new ArrayList<>();
        list.add("A 1 2");
        list.add("B 3 4");
        list.add("C 5 -");
        list.add("D - -");
        list.add("E 6 -");
        list.add("G 7 -");
        list.add("F - -");
        list.add("H - -");

        List<String> list2 = new ArrayList<>();
        list2.add("G - 4");
        list2.add("B 7 6");
        list2.add("F - -");
        list2.add("A 5 1");
        list2.add("H - -");
        list2.add("C 0 -");
        list2.add("D - -");
        list2.add("E 2 -");

//        遍历第一个数组
        for (String s : list) {
            String[] split = s.split(" ");

            String[] child = new String[]{"-","-"};

//            在第一个数组中,获取对应的子节点
            if (!split[1].equals("-")) {
                child[0] = list.get(Integer.parseInt(split[1])).split(" ")[0];
            }

            if (!split[2].equals("-")) {
                child[1] = list.get(Integer.parseInt(split[2])).split(" ")[0];
            }

//            在第二个数组中找到当前字母,然后在获取他的子节点字母
            String[] child2 = getChild(split[0], list2);

            Arrays.sort(child);
            Arrays.sort(child2);
//            比较子节点是否一致
            if (!child2.equals(child2)) {
                return false;
            }

        }
        return true;
    }

    /**
     * 获取子节点
     */
    private static String[]  getChild(String letter, List<String> list) {
        String[] strings = new String[]{"-","-"};
        for (String s : list) {
            if (s.split(" ")[0].equals(letter)) {
                if (!s.split(" ")[1].equals("-")) {
                    strings[0] = list.get(Integer.parseInt(s.split(" ")[1])).split(" ")[0];
                }

                if (!s.split(" ")[2].equals("-")) {
                    strings[1] = list.get(Integer.parseInt(s.split(" ")[2])).split(" ")[0];
                }


            }
        }

        return strings;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值