树的子结构(剑指Offer-26)

题面

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)

B是A的子结构, 即 A中有出现和B相同的结构和节点值。

例如: 给定的树 A:

1     3
2    / \
3   4   5
4  / \
5 1   2

给定的树 B:

1   4
2  /
3 1

返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。

示例

示例 1:

1输入:A = [1,2,3], B = [3,1]
2输出:false

示例 2:

1输入:A = [3,4,5,1,2], B = [4,1]
2输出:true

限制

10 <= 节点个数 <= 10000

思路

递归。

代码

 1/**
 2 * Definition for a binary tree node.
 3 * struct TreeNode {
 4 *     int val;
 5 *     TreeNode *left;
 6 *     TreeNode *right;
 7 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8 * };
 9 */
10class Solution {
11    bool equal(TreeNode *A, TreeNode *B){
12        if(B==NULL) return true;
13        if(A==NULL || A->val != B->val) return false;
14        return equal(A->left, B->left) && equal(A->right, B->right);
15    }
16public:
17    bool isSubStructure(TreeNode* A, TreeNode* B) {
18        if(A==NULL || B==NULL) return false;
19        return equal(A, B) || isSubStructure(A->left, B) || isSubStructure(A->right, B);
20    }
21};