《剑指offer》练习-面试题26-树的子结构

题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

链接:https://www.nowcoder.com/questionTerminal/6e196c44c7004d15b1610b9afca8bd88
来源:牛客网

package offer;

public class Solution26 {
	public boolean HasSubtree(TreeNode root1, TreeNode root2) {
		if (root1 == null || root2 == null)
			return false;

		boolean result = false;

		if (root1.val == root2.val)// 在A中找到了B的根结点
			result = doseTree1HaveTree2(root1, root2);  // 以这个根结点为起点判断是否包含B树

		if (!result)  // 如果上面的结果是不包含
			result = HasSubtree(root1.left, root2);  // 去A树刚刚找到的那个点的左子结点,再往下找和B树根结点值相等的点,然后再判断是否是子结构

		if (!result)
			result = HasSubtree(root1.right, root2); // 上面结果还是否,再看右子节点

		// 至此已经把A树遍历完了	
		return result;

	}

	public static boolean doseTree1HaveTree2(TreeNode node1, TreeNode node2) {
		// 如果B树已经遍历完了,说明在A树中都对上了
		if (node2 == null)
			return true;

		// 如果A树遍历完了,而B树没有,那说明没有完全对上
		if (node1 == null)
			return false;

		// 对不上
		if (node1.val != node2.val)
			return false;
		
		// 递归返回的这个值,原本就带有循环的意思
		return doseTree1HaveTree2(node1.left, node2.left) && doseTree1HaveTree2(node1.right, node2.right);
	}
}

猜你喜欢

转载自blog.csdn.net/sinat_34548226/article/details/81211102