剑指 Offer 26. 树的子结构
这个题太妙了。递归真的很神奇,有人说一步步理解没必要,好像是的,理解递归函数要实现的功能是关键。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
//判断以A为根的树和以B为根的树是否相同:用另一个函数实现,该函数应实现一一比较,根比较根,左孩子比较左孩子...
if(A==null||B==null)//空树不是任意一个树的子结构
return false;
//以A的先序遍历为线索找到与B的根节点匹配的节点,从该节点开始比较(同上,比较函数用另一个函数实现。两个函数要实现的功能不一样,一个是先序遍历找到与B相同的节点,一个实现两个树的比较)
return compare(A,B)||isSubStructure(A.left,B)||isSubStructure(A.right,B);
}
boolean compare(TreeNode A, TreeNode B)
{
if(B==null)//为什么终止条件是这样写?思考一般情况即可。函数功能是用递归比较,进行到这一步表示B已经遍历完毕
return true;
if(A==null||A.val!=B.val)//进行这一步,表明B不为空,还要继续比较,若A为空,显然不匹配
return false;
//比较左子树,右子树
return compare(A.left,B.left)&&compare(A.right,B.right);
}
}

浙公网安备 33010602011771号