(一)题目描述
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
(二)解题思路
1、首先遍历A树(isSubStructure(A, B))
2、然后将遍历的A树的每个节点 为根节点,判断其是否包含B树(recur(A, B))
具体解法:
isSubStructure(A, B) 函数:
特例处理: 当 树 A 为空 或 树 B 为空 时,直接返回 false ;(因空不为任一子结构)
返回值: 若树 B是树 A 的子结构,则必满足以下三种情况之一,因此用或 || 连接;
(1)以 节点 A 为根节点的子树包含树 B ,则调用 recur(A, B);
(2)树 B是 树 A 左子树 的子结构,则先遍历A的左节点 isSubStructure(A.left, B);
(3)树 B是 树 A 右子树 的子结构,则遍历A的右节点 isSubStructure(A.right, B);
(三)代码如下
class Solution10{
// isSubStructure()遍历A中每个节点
public boolean isSubStructure(TreeNode A, TreeNode B) {
if(A==null || B==null)
return false;//约定空树不是任意一个树的子结构
if(helper(A,B))
return true;
return isSubStructure(A.left,B) || isSubStructure(A.right,B);//递归判断A树所有子树是否包含B树
}
//该函数的作用是:判断A树根节点值和B树根节点值是否相等,若不等,返回false
// 若相等,再递归判断A树的孩子节点和B树的的孩子节点是否对应相等,如果对应相等了,就说明A的子结构包含B树,返回true。
// 否者就不包含,返回false
public boolean helper(TreeNode A,TreeNode B){
if(B==null)
//B树遍历完,则说明相等
return true;
//A树为空或者A节点的值不等于B结点的值,返回false
if(A==null || A.val!=B.val)
return false;
//当A.val==B.val时,递归判断A树的子节点和B树的子节点是否对应相等
return helper(A.left,B.left) && helper(A.right,B.right);
}
}
心得:对于树的很多递归题,想清楚如何分解为子问题就好做了,函数内调用递归函数不要太纠结细节,清楚函数的功能就行