剑指offer--18.树的子结构

题目:输入两棵二叉树A和B,判断B是不是A的子结构。
public class wr18hasSubTree {
//	第一步:在树A中查找与根节点的值一样的结点
	public boolean HasSubtree(TreeNode root1,TreeNode root2) {
		boolean result=false;
//		当tree1和tree2都不为0的时候才进行比较,否则直接返回false
		if(root2!=null && root1!=null){
//			如果找到了对应tree2的根节点的点,以这个根节点为起点判断是否包含tree2
			if(root1.val==root2.val){
				result=doesTree1HaveTree2(root1,root2);
			}
//			如果找不到,root左儿子当起点,判断是否包含tree2
			if(!result){
				result=HasSubtree(root1.left,root2);
			}
//			如果还找不到,root右儿子当做起点
			if(!result){
				result=HasSubtree(root1.right,root2);
			}
		}
		return result;
    }
//	第二步,判断树A中以R为根节点的子树是不是和树B具有相同的结构
//	思路:如果结点R的值和树B的根节点不同,则以R为根节点的子树和树B肯定不具有相同的结点
//	如果他们的值相同,则递归判断他们各自的左右结点的值是不是相同
//	递归的终止条件是我们到达了树A或者树B的叶子结点
	public static boolean doesTree1HaveTree2(TreeNode node1,TreeNode node2){
		if(node2==null){
			return true;
		}
		if(node1==null){
			return false;
		}

		if(node1.val!=node2.val){
			return false;
		}

		return doesTree1HaveTree2(node1.left,node2.left)&&doesTree1HaveTree2(node1.right,node2.right);
	}
}

猜你喜欢

转载自blog.csdn.net/autumn03/article/details/80168886