剑指17.树的子结构
题目描述
输入两棵二叉树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) { if(root1 == null || root2 == null) return false; return judge(root1,root2) || HasSubtree(root1.left,root2) || HasSubtree(root1.right,root2); } private boolean judge(TreeNode root1,TreeNode root2){ if(root2 == null) { return true; } if(root1 == null) { return false; } if(root1.val != root2.val) { return false; } return judge(root1.left,root2.left) && judge(root1.right,root2.right); } }