拓扑结构相同子树练习题

来源:互联网 发布:大数据用什么软件 编辑:程序博客网 时间:2024/05/29 04:58

对于两棵彼此独立的二叉树A和B,请编写一个高效算法,检查A中是否存在一棵子树与B树的拓扑结构完全相同。
给定两棵二叉树的头结点A和B,请返回一个bool值,代表A中是否存在一棵同构于B的子树。
解题思路:我先把树序列化然后,进行字符串的对比。

public class IdenticalTree {    public boolean chkIdentical(TreeNode t1, TreeNode t2){        String t1Str = serialByPre(t1);        String t2Str = serialByPre(t2);        return getIndexOf(t1Str, t2Str) != -1;    }    //KMP    private int getIndexOf(String s, String m) {        if(s == null || m == null || m.length() < 1 ||s.length() < m.length()){            return -1;        }        char[] ss = s.toCharArray();        char[] ms = m.toCharArray();        int[] nextArr = getNextArray(ms);        int index = 0;        int mi = 0;        while(index < ss.length && mi < ms.length){            if(ss[index] == ms[mi]){                index++;                mi++;            }else if(nextArr[mi] == -1){                index++;            }else{                mi = nextArr[mi];            }        }        return mi == ms.length? index - mi: -1;    }    private static int[] getNextArray(char[] ms) {        if(ms.length == 1){            return new int[]{-1};        }        int[] nextArr = new int[ms.length];        nextArr[0] = -1;        nextArr[1] = 0;        int pos = 2;        int cn = 0;        while(pos < nextArr.length){            if(ms[pos - 1] == ms[cn]){                nextArr[pos++] = ++cn;            }else if(cn > 0){                cn = nextArr[cn];            }else{                nextArr[pos++] = 0;            }        }        return nextArr;    }    private String serialByPre(TreeNode head) {        if(head == null){            return "#!";        }        String res = head.val + "!";        res += serialByPre(head.left);        res += serialByPre(head.right);        return res;    }}
0 0