剑指Offer:树的子结构
题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
解题思路
实话实说这道题是剑指Offer前半部分难度比较大的,我们先来思考一个简单情况,如下图,左树枝叶比右树繁茂,但是枝干是相同的,不同的枝叶情况不一样。
此时,我们如何确定说根节点相同的左树包含右树呢?右树有的节点,我左树在对应位置都有!单反有一个节点值或位置不对,则说明左树不包含右树。我们成这个算法为F(X,Y)。
我们再来考虑一种复杂情况,即左树存在多个和右树根节点相同的节点x1、x2....,此时我们以x1、x2....分别作为为根节点和右树进行F(X,Y)即可,只要有一个能够返回TRUE,则认为左树包含右树。
递归代码言简意赅,但是理解起来确实有点难度!?
Java题解
public class Solution { public boolean HasSubtree(TreeNode root1,TreeNode root2) { if(root1==null||root2==null) return false; if(root1.val==root2.val&&isContain(root1,root2)){ return true; } return HasSubtree(root1.left,root2)||HasSubtree(root1.right,root2); } /** * 比较是否包含 * @param node1 * @param node2 * @return */ public boolean isContain(TreeNode node1, TreeNode node2){ //我为空,你不为空,说明我不包含你 if(node1==null&&node2!=null) return false; //咱俩都空,等于值相同 if(node2==null) return true; return node1.val == node2.val&& isContain(node1.left, node2.left) && isContain(node1.right, node2.right); } } /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */