树的子结构

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

分析
在这里插入图片描述
查找A中是否存在树B结构一样的子树,可以分为两步:
第一步,在树A中找到和树B的根节点的值一样的节点R
第二步,判断A中以R为根节点的子树是不是包含和树B一样的结构

以上面为例,先在A中找到值为8的节点,接着判断树A的根节点下面的子树是不是含有和树B一样的结构。在A中根节点的左子节点为8,而树B的根节点的左子节点为9,对应两个节点不同。
接着找8的节点,在A中第二层找到,然后进行第二步的判断(判断这个节点下面的子树是否含有树B一样的结构)

代码
第一步

	public boolean HasSubtree(TreeNode root1,TreeNode root2) {

		boolean result = false;

		//当root1和root2都不为null的时候,才进行比较。否则直接返回false
		if(root1 != null && root2 != null) {
			//如果找到了对应root2的根节点的点
			if(root1.val == root2.val) {
				//以这个根节点为为起点判断是否包含root2
				result = DoesTreeHaveTree2(root1, root2);
			}

			if(!result) {
				//如果找不到,那么就再去root1的左儿子当作起点,去判断时候包含root2
				result = HasSubtree(root1.left, root2);
			}

			if(!result) {
				//如果还找不到,那么就再去root1的右儿子当作起点,去判断时候包含root2
				result = HasSubtree(root1.right, root2);
			}
		}
		return result;
	}

第二步

	public boolean DoesTreeHaveTree2(TreeNode node1, TreeNode node2) {

		//如果node2已经遍历完了都能对应的上,返回true
		if(node2 == null) {
			return true;
		}

		//如果node2还没有遍历完,node1却遍历完了。返回false
		if(node1 == null) {
			return false;
		}

		//如果其中有一个点没有对应上,返回false
		if(node1.val != node2.val) {
			return false;
		}

		//如果根节点对应的上,那么就分别去子节点里面匹配
		return DoesTreeHaveTree2(node1.left, node2.left) && DoesTreeHaveTree2(node1.right, node2.right);

	}
posted @ 2019-03-21 22:13  如是说  阅读(2533)  评论(0编辑  收藏  举报