剑指offer(17)树的子结构

package java_jianzhioffer_algorithm;


/**
 * 题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
 * @author hexiaoli
 * 思考:
 *   递归:先找到B的根元素在A中的位置,再判断树A中以root为根节点的子树是不是包含和树B一样的结构。
 */
class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}
public class HasSubtree {
	public static boolean hasSubtree(TreeNode root1,TreeNode root2) {
		boolean result = false;
		if(root1 != null && root2 !=null) {
			if(root1.val == root2.val) {
				// 先找根节点是否满足
				result = isEqual(root1, root2);
			}
			if(!result) {
				// 如果根节点不满足,则找左子树
				result = isEqual(root1.left, root2);
			}
			if(!result) {
				// 如果左子树依旧不满足,则找右子树
				result = isEqual(root1.right, root2);
			}
		}
		return result;
	}
	public static boolean isEqual(TreeNode node1,TreeNode node2) {
		if(node2 == null) {
			return true;
		}
		if(node1 == null ) { 
			return false;
		}
		if (node1.val != node2.val) {
			return false;
		}
		// 在根结点相同的情况下,比较该根节点下的左右子树是否相同
		return isEqual(node1.left,node2.left)&&isEqual(node1.right,node2.right);
	}
	public static void main(String[] args) {
		TreeNode head1 = new TreeNode(5);
		TreeNode level1l = new TreeNode(4);
		TreeNode level1r = new TreeNode(6);
		TreeNode level2l = new TreeNode(3);
		TreeNode level2r = new TreeNode(7);
		head1.left = level1l;
		head1.right = level1r;
		level1l.left = level2l;
		level1r.right = level2r;
		TreeNode level1l2 = new TreeNode(4);
		TreeNode level2l2 = new TreeNode(3);
		level1l2.left = level2l2;
		boolean result;
		result = hasSubtree(head1, level1l2);
		System.out.println(result);
	}

}

猜你喜欢

转载自blog.csdn.net/hxl0925/article/details/89948382
今日推荐