剑指 Offer 26. 树的子结构

 

 

解题复盘

这题已经做过了,但是今天再重做时仍然没做出来,是不是年纪大了脑袋不灵光。。。。

见到此题,与树相关,思路当然首先要想到回溯!但是做题时只注意到回溯的终止条件,对于何时开始回溯并未仔细考虑。B为A的子树,B的根节点可能在A树的任何一个地方,所以在判断是否为子树的回溯的基础上还需要对树进行遍历,找到根节点相同的地方开始进行回溯遍历。

 

解题思路

本题的实质也是由两块组成:1. 如何在原树中找到子树的根节点 2. 如何判断后续节点与原树相同

  1. 遍历原树,使用先序遍历,先判断该节点,再判断左右子节点。在先序遍历树的时候,不需要额外再写函数,直接递归调用原函数即可。

  2. 当原树根节点或者子树根节点任意一个为空时,都为false,所以return时加上 &&  A != null && B != null
  3. 比较通俗的说法是:recur(A,B)的作用是检验以B为根节点的树是否为以A为根节点树的子树;而issubstructure()负责判断A,B是否为空以及遍历原树,让A试遍所有可能性!
  4. recur 终止条件:fasle:原树已空而子树未空、值不相等 true:子树已空

class Solution {
    public boolean isSubStructure(TreeNode A, TreeNode B) {        
        return (A != null && B != null) && (recur(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B));
    }
    boolean recur(TreeNode A, TreeNode B) {
        if(B == null) return true;
        if(A == null || A.val != B.val) return false;
        return recur(A.left, B.left) && recur(A.right, B.right);
    }
}

  

 

 

posted @ 2022-02-01 23:29  raindance1024  阅读(27)  评论(0)    收藏  举报