//输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
//
// B是A的子结构, 即 A中有出现和B相同的结构和节点值。
//
// 例如:
//给定的树 A:
//
// 3
// / \
// 4 5
// / \
// 1 2
//给定的树 B:
//
// 4
// /
// 1
//返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
//
// 示例 1:
//
// 输入:A = [1,2,3], B = [3,1]
//输出:false
//
//
// 示例 2:
//
// 输入:A = [3,4,5,1,2], B = [4,1]
//输出:true
//
// 限制:
//
// 0 <= 节点个数 <= 10000
// Related Topics 树
// 👍 220 👎 0
class Solution { private boolean isSubStructure = false; public boolean isSubStructure(TreeNode rootA, TreeNode rootB) { if (rootA == null || rootB == null) { return false; } dfsTree(rootA, rootB); return isSubStructure; } public void dfsTree(TreeNode rootA, TreeNode rootB) { // 在左对比树搜索,如果到了叶子节点,就返回 if (rootA == null) { return; } // 两者节点相同时,就进一步比较左右字节点。 // 比较完在当前层就会结束 if (rootA.val == rootB.val) { if (dfsTreeHelper(rootA, rootB)) { isSubStructure = true; return; } } // 继续在A树中寻找和对比 dfsTree(rootA.left, rootB); dfsTree(rootA.right, rootB); } private boolean dfsTreeHelper(TreeNode rootA, TreeNode rootB) { // 左树结束,但是右树未结束,返回false // 如 3-1, 3-1-2, 3.right = null,但是3.right =2 if (rootA == null && rootB != null) { return false; } //右树搜完了 if (rootB == null) { return true; } if (rootA.val != rootB.val) { return false; } return dfsTreeHelper(rootA.left, rootB.left) && dfsTreeHelper(rootA.right, rootB.right); } }