这个题目的方法就是在根树结构中不断查找与子树结构相同的起始根节点,如果找到则再比较这个根的左右子树是否也相等,如果递归到子树为空了,就返回true,否则均返回false。具体代码如下:
1 package test; 2 3 class TreeNode{ 4 int val; 5 TreeNode left=null; 6 TreeNode right=null; 7 public TreeNode(int val){ 8 this.val = val; 9 } 10 } 11 12 public class IsTreeChild{ 13 14 public boolean is(TreeNode parent,TreeNode child){ 15 boolean result = false; 16 if(parent!=null && child!=null){ 17 if(parent.val==child.val){ 18 result = EqualOrNot(parent,child); 19 } 20 if(!result){ 21 result = is(parent.left,child); 22 } 23 if(!result){ 24 result = is(parent.right,child); 25 } 26 } 27 return result; 28 } 29 30 31 private boolean EqualOrNot(TreeNode parent,TreeNode child){ 32 //要先判断child是否为空,子结点为空,那么就是真的,如果先判断parent是否为空,则可能出现两者同时为空的情况,此时其实是true的,但是会返回false。 33 if(child==null){ 34 return true; 35 } 36 if(parent==null){ 37 return false; 38 } 39 40 if(parent.val!=child.val){ 41 //这个if判断必须添加,虽然从is()过来的两个值肯定相等,但是从equal自身开始递归的两个值就不一定相当了,如果不想等,那么就需要返回false 42 //重新回到parent树中寻找下一个相等的起始节点. 43 return false; 44 } 45 46 return EqualOrNot(parent.left,child.left)&&EqualOrNot(parent.right,child.right); 47 } 48 49 public static void main(String [] args){ 50 TreeNode parent = new TreeNode(8); 51 TreeNode l1 = new TreeNode(8); 52 TreeNode l2 = new TreeNode(7); 53 TreeNode l3 = new TreeNode(9); 54 TreeNode l4 = new TreeNode(2); 55 TreeNode l5 = new TreeNode(4); 56 TreeNode l6 = new TreeNode(7); 57 parent.left = l1; 58 parent.right = l2; 59 l1.left = l3; 60 l1.right = l4; 61 l4.left = l5; 62 l4.right = l6; 63 64 TreeNode child = new TreeNode(8); 65 TreeNode c1 = new TreeNode(9); 66 TreeNode c2 = new TreeNode(2); 67 child.left=c1; 68 child.right = c2; 69 70 IsTreeChild ict = new IsTreeChild(); 71 System.out.println(ict.is(parent,child)); 72 73 74 75 } 76 }