题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
题目分析 用递归来实现,从A树的根节点开始,判断其所有的节点是不是依次和树B相同,如不同,递归调用函数,继续判断树A当前节点的左子树的所有节点或右子树的所有节点是否和树B所有节点相同,直到遍历到父树A的叶子节点,如果不是完全相同,则树B不是树A子树,如果直到遍历到树B的叶子节点,其所有节点在树A中均有,则树B是树A的子树。
同时注意利用短路的特性 A&&B:当A为假的时候,结果就是假的,就不会再看B,只有结果是真的时候,才会看B的结果。而且取决于B。
A||B:当A为真的时候,结果就是真的,就不会再看B,只有结果是假的时候,才会看A的结果。而且取决于B。
下面是Java代码
public class Solution { public boolean HasSubtree(TreeNode root1,TreeNode root2) { if(root1 == null){ return false; } if(root2 == null){ return false; } return doesTree1HasTree2(root1,root2)||HasSubtree(root1.left,root2)||HasSubtree(root1.right,root2); } private boolean doesTree1HasTree2(TreeNode root1, TreeNode root2){ if(root2 == null){ return true; } if(root1 == null){ return false; } return root1.val==root2.val && doesTree1HasTree2(root1.left,root2.left)&&doesTree1HasTree2(root1.right,root2.right); } }参考https://www.nowcoder.com/practice/6e196c44c7004d15b1610b9afca8bd88?tpId=13&&tqId=11170&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking