剑指offer题16

xiaoxiao2021-02-28  53

package jianzhioffer; import java.util.Scanner; /** * 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) * 采用两种方法:递归判断节点;对两个树进行先序遍历/DFS.对序列采用KMP算法,判断是否为子序列 */ //树节点类 /*class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } }*/ public class Solution16 { //方法一:递归进行节点的判断 public static boolean HasSubtree(TreeNode root1,TreeNode root2) { boolean result = false; //标志位,判断是否匹配成功 //当tree1和Tree2都不为零的时候,才进行比较,否则直接返回false if(root1 != null && root2 != null){ //如果找到了对应的tree2的根节点的点 if(root1.val == root2.val){ //以这个根节点为起点判断是否包含Tree2 result = Tree1hasTree2(root1,root2) ; } //如果找不到,那么就再去root1的左儿子当作起点,去判断是否包含tree2 if(!result){ result = HasSubtree(root1.left,root2); } //如果找不到,那么就再去root的右儿子作为起点,去判断是否包含tree2 if(!result){ result = HasSubtree(root1.right,root2); } } //返回结果 return result; } private static boolean Tree1hasTree2(TreeNode node1, TreeNode node2) { // 如果Tree2已经遍历完了都能对应上,返回True if(node2 == null){ return true; } //如果Tree2还没遍历完,Tree1却遍历完了,返回false if(node1 == null){ return false; } //如果其中有一个点没有对应上,返回false if(node1.val != node2.val){ return false; } //如果根节点对应上,那么分别去子节点下面匹配 return Tree1hasTree2(node1.left,node2.left) && Tree1hasTree2(node2.right,node2.right); } //利用KMP算法,将root1和root2分别按先序遍历序列化,运用KMP算法匹配序列化结果 /* public static boolean HasSubtree(TreeNode root1,TreeNode root2) { if(root1 == null || root2 == null){ return false; } char[] str = Serialize(root1).toCharArray(); char[] pattern = Serialize(root2).toCharArray(); int[] next = new int[pattern.length]; System.out.println(String.valueOf(str)); System.out.println(String.valueOf(pattern)); getNext(pattern,next); return KMP(str,pattern,next); } public static String Serialize(TreeNode root) { //有点问题还没实现,需要改进 if(root == null) return ""; StringBuffer buffer = new StringBuffer(); int i; //删除序列尾部的$ for(i=buffer.length()-1; i>=0;i--){ if(buffer.charAt(i) == ' ' || buffer.charAt(i)=='$'){ continue; }else{ break; } } buffer.delete(i+1, buffer.length()); return buffer.toString(); } public static void getNext(char[] pattern, int[] next) { if(pattern == null || pattern.length ==0) return; int i = 0, j = -1; next[0] = -1; while(i<pattern.length-1){ if(j ==-1 || pattern[i] == pattern[j]){ ++i; ++j; if(pattern[i] == pattern[j]){ next[i] = next[j]; }else{ next[i] = j; } }else{ j = next[j]; } } } public static boolean KMP(char[] str, char[] pattern, int[] next) { if(str == null || pattern == null) return false; if(str.length<pattern.length) return false; int i = 0,j =0,len = str.length; while(i<len && j<pattern.length ){ if(j == -1 || str[i] == pattern[j]){ i++;j++; }else{ j = next[j]; } } if(j == pattern.length) //表示最后一个字符也想等,匹配成功 return true; return false; } */ public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); int[] a1 = new int[n]; int[] a2 = new int[m]; for(int i = 0;i<n;i++){ a1[i] = sc.nextInt(); } for(int i = 0;i<m;i++){ a2[i] = sc.nextInt(); } TreeNode tree1 = new TreeNode(a1[0]); TreeNode tree2 = new TreeNode(a1[1]); TreeNode tree3 = new TreeNode(a1[2]); TreeNode tree4 = new TreeNode(a1[3]); TreeNode tree5 = new TreeNode(a1[4]); tree1.left = tree2; tree1.right = tree3; tree2.left = tree4; tree2.right = tree5; TreeNode node1 = new TreeNode(a2[0]); TreeNode node2 = new TreeNode(a2[1]); TreeNode node3 = new TreeNode(a2[2]); node1.left = node2; node1.right = node3; boolean result = HasSubtree(tree1,node1); System.out.println(result); } }
转载请注明原文地址: https://www.6miu.com/read-97084.html

最新回复(0)