解题复盘
这题已经做过了,但是今天再重做时仍然没做出来,是不是年纪大了脑袋不灵光。。。。
见到此题,与树相关,思路当然首先要想到回溯!但是做题时只注意到回溯的终止条件,对于何时开始回溯并未仔细考虑。B为A的子树,B的根节点可能在A树的任何一个地方,所以在判断是否为子树的回溯的基础上还需要对树进行遍历,找到根节点相同的地方开始进行回溯遍历。
解题思路
本题的实质也是由两块组成:1. 如何在原树中找到子树的根节点 2. 如何判断后续节点与原树相同
-
遍历原树,使用先序遍历,先判断该节点,再判断左右子节点。
-
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); } }