1.题目:
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
2.思路:
首先主方法:
1.首先需要判断A,B的根节点是否一样。
2.如果不一样,判断A的左孩子和B的根节点是否一样,或者判断A的右孩子和B的根节点是否一样。依次找下去,直到找到相同进入次方法
如果上述情况都不满足则说明不包含
其次:次方法递归遍历当前节点的子树是否完全相同:
1.如果找到了A中有值和B中的根节点相同,则比较左右子树是否相同。
2.如果B为空了,则说明包含
3.如果A为空了或者存在不等的情况,则说明不包含
public class Solution { public boolean HasSubtree(TreeNode root1,TreeNode root2) { if(root1==null||root2==null){ return false; } //1.第一种情况,两颗子树相同 if(root1.val==root2.val){ if(judge(root1,root2)){ return true; } } //2.第二种情况,从属关系,大树左、右子树都递归遍历直到找到与小树根节点相同的值 return HasSubtree(root1.left,root2)||HasSubtree(root1.right,root2); } public boolean judge(TreeNode bigTree,TreeNode smallTree){ //小树一旦循环完毕,代表全部匹配成功 if(smallTree==null){ return true; } //大树遍历完或者存在不相等的值,肯定不匹配 if(bigTree==null||bigTree.val!=smallTree.val){ return false; } //相等后,判断递归遍历判断左右孩子是否都相等 return judge(bigTree.left,smallTree.left)&&judge(bigTree.right,smallTree.right); } }