标签:
版权声明:本文为博主原创文章,未经博主允许不得转载。
题目描述:
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)。
解题思路:
首先看牛客网给出的测试用例:
一般对于树的操作不像链表一样,操作更复杂,如果使用循环遍历的话,对于非完全二叉树规律难寻,一般通用的方法就是使用递归求解,本题也不例外,同样使用递归求解,求解的大体思路是首先判断B的根节点和A的根节点是否相同(这里的相同是指节点的值相同并且左右子节点相同),如果相同比较他们的左右子节点,这一步骤是相同的,可以用递归完成,直到B遍历到每个尾节点,如果这一过程比较的所有节点是相同的,则证明B是A的子结构。如果B的根节点和A的根节点不同,则A向他的左右子节点滑动,然后继续跟B的子节点比较,步骤同上。
递归的使用可以用我总结的三步来完成。求解过程如下:
源码:
1 /** 2 * 输入两棵二叉树A,B,判断B是不是A的子结构。 3 * @param root1 A树 4 * @param root2 B数 5 * @return 6 */ 7 public static boolean HasSubtree(TreeNode root1,TreeNode root2) { 8 9 if (root2==null) { //空树不是任意一个树的子结构 10 return false; 11 } 12 if (root1==null) { //如果A为空,那肯定返回false 13 return false; 14 } 15 if(root2.val==root1.val){ //A和B比较的根节点的值相同 16 17 if (root2.left==null&&root2.right==null) { //比较的节点是B的尾节点,递归截止 18 return true; 19 } 20 //下面三种比较的是比较的节点完全相同的情况 21 if ((root2.left!=null&&root2.right!=null)&&(root1.left!=null&&root1.right!=null)&&root2.left.val==root1.left.val&&root2.right.val==root1.right.val) { 22 return HasSubtree(root1.left,root2.left)&& HasSubtree(root1.right,root2.right); 23 }else if ((root2.left!=null&&root2.right==null)&&(root1.left!=null&&root1.right==null)&&root2.left.val==root1.left.val) { 24 return HasSubtree(root1.left,root2.left); 25 }else if ((root2.left==null&&root2.right!=null)&&(root1.left==null&&root1.right!=null)&&root2.right.val==root1.right.val) { 26 return HasSubtree(root1.right,root2.right); 27 }else{ //比较的节点不同,A向左右子节点移动一个再比较 28 if (root1.left!=null&&root1.right!=null) { 29 return HasSubtree(root1.left,root2)|| HasSubtree(root1.right,root2); 30 }else if(root1.left==null&&root1.right!=null){ 31 return HasSubtree(root1.right,root2); 32 }else if(root1.left!=null&&root1.right==null){ 33 return HasSubtree(root1.left,root2); 34 }else { 35 return false; 36 } 37 } 38 //比较的根节点的值不相同,直接向左右子节点滑动 39 }else if(root1.left!=null&&root1.right==null){ 40 return HasSubtree(root1.left,root2); 41 }else if(root1.left==null&&root1.right!=null){ 42 return HasSubtree(root1.right,root2); 43 }else{ 44 return false; 45 } 46 }
标签:
原文地址:http://www.cnblogs.com/centor/p/5803535.html