剑指 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);
    }
}
posted @ 2021-03-16 01:07  wsshub  阅读(32)  评论(0)    收藏  举报