572.另一个树的子树

subtree-of-another-tree

题目描述

给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。

示例 1:
给定的树 s:
1
给定的树 t:
2
返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值。

示例 2:
给定的树 s:
3
给定的树 t:
4
返回 false。

代码

public class Solution {
	
	public boolean isSubtree(TreeNode s,TreeNode t){
		/*
		 * equals方法检查以s和t为根的两棵子树是否相等
		 * isSubtree递归检查t是否存在于s的左或右子树中;
		 * 又或者以s为根的这棵树就是与以t为根的那棵树相等的树,使用equals检查即可。
		 */
		if(s == null && t!=null){
			//递归进行到s为空,返回false
			return false;
		}
		
		boolean isSubInLeft = isSubtree(s.left,t);
		boolean isSub = equals(s,t);//检查当前结点s是否可以和子树t匹配
		boolean isSubInRight = isSubtree(s.right,t);
		if(isSubInLeft || isSub || isSubInRight){
			return true;
		}
		return false;
	}
	
	public boolean equals(TreeNode s,TreeNode t){
		if(s == null && t == null){
			//比较到最下部
			return true;
		}else if(s == null || t == null){
			//两者中只有一者为空,必然不等,处理t是s“子树中的一部分”,即示例2的情况
			return false;
		}
		if(s.val == t.val){
			boolean resOfLeft =  equals(s.left,t.left);
			boolean resOfRight = equals(s.right,t.right);
			if(resOfLeft && resOfRight){
				//两孩子结点相等
				return true;
			}
		}
		//除以上情况外的其它情况,返回false
		return false;
	}
}

性能表现
性能表现

发布了75 篇原创文章 · 获赞 0 · 访问量 1500

猜你喜欢

转载自blog.csdn.net/qq_34087914/article/details/104159075