题目:
解析:
这个题目的目的很明确,就是判断A是否包含B。这里的做法是对两颗二叉树分别求先序遍历,接着比较。但是要注意的是,先序遍历需要进行特殊处理。
举例:
先对整A棵树进行先序遍历,序列为12453。
情况一:假设B二叉树只有一个节点3,那么B子树的先序遍历序列就是3,接着判断3是否为12453的子串,这里显然是,但是这只是简单的一种情况。
情况二:假设B二叉树只有一个节点2,那么如果直接判断2是否为12453的子串是不能得到正确的答案的,因为A中2还有子节点,所以在遍历A树的时候要进行一些处理。
处理的方法就是,如果一个节点的左子树为空,在序列后加上一个特殊符号(不能是二叉树节点),比如“-”,当右子树为空时加上“+”,这样问题就解决了。
处理后A的序列为124-+5-+3-+ (相当于把叶子节点标示出来)
回到情况二,这个时候如果B树的遍历序列变成了2-+,这个串并不是A序列的子串,所以正确。
代码:
1 package com.fndroid; 2 3 4 public class Main { 5 6 public static void main(String[] args) { 7 Main main = new Main(); 8 main.chkIdentical(null, null); 9 } 10 11 public boolean chkIdentical(TreeNode A, TreeNode B) { 12 StringBuilder sb1 = new StringBuilder(); 13 un(A, sb1); 14 StringBuilder sb2 = new StringBuilder(); 15 un(B, sb2); 16 return sb1.toString().contains(sb2.toString()); // 子串判断 17 } 18 19 public void un(TreeNode root, StringBuilder sb) { 20 sb.append(root.val); 21 if (root.left != null) { 22 un(root.left, sb); 23 }else{ 24 sb.append("-"); // 标识叶子节点 25 } 26 if (root.right != null) { 27 un(root.right, sb); 28 }else{ 29 sb.append("+"); 30 } 31 } 32 33 public class TreeNode { 34 int val = 0; 35 TreeNode left = null; 36 TreeNode right = null; 37 38 public TreeNode(int val) { 39 this.val = val; 40 } 41 } 42 }