剑指 Offer 26. 树的子结构

解题复盘
这题已经做过了,但是今天再重做时仍然没做出来,是不是年纪大了脑袋不灵光。。。。
见到此题,与树相关,思路当然首先要想到回溯!但是做题时只注意到回溯的终止条件,对于何时开始回溯并未仔细考虑。B为A的子树,B的根节点可能在A树的任何一个地方,所以在判断是否为子树的回溯的基础上还需要对树进行遍历,找到根节点相同的地方开始进行回溯遍历。
解题思路
本题的实质也是由两块组成:1. 如何在原树中找到子树的根节点 2. 如何判断后续节点与原树相同
-
遍历原树,使用先序遍历,先判断该节点,再判断左右子节点。在先序遍历树的时候,不需要额外再写函数,直接递归调用原函数即可。
- 当原树根节点或者子树根节点任意一个为空时,都为false,所以return时加上 && A != null && B != null
- 比较通俗的说法是:recur(A,B)的作用是检验以B为根节点的树是否为以A为根节点树的子树;而issubstructure()负责判断A,B是否为空以及遍历原树,让A试遍所有可能性!
-
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);
}
}

2022年啦!今天是初一,祝大家新年好!时间过的太快啦!
浙公网安备 33010602011771号