题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
分析
若树B是树A的子结构,则子结构的根节点可能为树A的任意一个节点。因此,需要完成以下两步操作:
- 第一步:在树A中找到和树B的根节点的值一样的节点 R (也就是树A的遍历);
- 第二步:判断树A中以 R 为根节点的子树是不是包含和树B一样的结构。
注意:与二叉树相关的代码有大量的指针操作,每次访问指针地址时要警惕这个指针有没有可能是nullptr,如果是该如何处理?!
☆☆☆题解
/** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { public boolean HasSubtree(TreeNode root1,TreeNode root2) { boolean result = false; if(root1 != null && root2 != null){ if(root1.val == root2.val) result = DoesTree1HaveTree2(root1,root2); //如果找不到,依次遍历左右孩子 if(!result) result = HasSubtree(root1.left,root2); if(!result) result = HasSubtree(root1.right,root2); } return result; } public boolean DoesTree1HaveTree2(TreeNode root1,TreeNode root2){ //判断的顺序很重要,因为root1为null有两种情况 if(root2 == null) //说明树B已经遍历完了都能对应的上 return true; //注意root1为null有两种情况,(1)root1==null&&root2!=null说明匹配失败;(2)root1==null&&root2==null说明匹配成功。 if(root1 == null) //如果树B还没有遍历完(root2!=null),树A却遍历完了(root1==null),说明匹配失败 return false; if(root1.val == root2.val){//根节点能对应上,再分别判断左右孩子是否匹配 return DoesTree1HaveTree2(root1.left,root2.left) && DoesTree1HaveTree2(root1.right,root2.right); }else{ return false; } } }