输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 给定的树 A: 3 / \ 4 5 / \ 1 2 给定的树 B: 4 / 1 返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
示例 1:
1 2 输入:A = [1,2,3], B = [3,1] 输出:false
示例 2:
1 2 输入:A = [3,4,5,1,2], B = [4,1] 输出:true
限制:
解法一:暴力法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: void scan(TreeNode* A,vector<TreeNode*> &tree,int &target){ if(!A)return; if(A->val == target){ tree.push_back(A); } scan(A->left,tree,target); scan(A->right,tree,target); } bool check(TreeNode *A,TreeNode *B){ if(!B)return true; if(!A) return false; bool res = A->val == B->val; if(!res) {return false;} res = res && check(A->left,B->left); if(!res) {return false;} res = res && check(A->right,B->right); return res; } bool isSubStructure(TreeNode* A, TreeNode* B) { if(!B)return false; vector<TreeNode*> tree; int target = B->val; scan(A,tree,target); for(TreeNode* t:tree){ if(check(t,B)){ return true; } } return false; } };
结果:
1 2 3 4 5 6 7 8 9 10 11 12 执行用时: 32 ms , 在所有 C++ 提交中击败了 91.49% 的用户 内存消耗: 33.1 MB , 在所有 C++ 提交中击败了 8.69% 的用户 通过测试用例: 48 / 48
优化一点点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: bool check(TreeNode *A,TreeNode *B){ if(!B)return true; if(!A) return false; return A->val == B->val && check(A->left,B->left) && check(A->right,B->right); } bool isSubStructure(TreeNode* A, TreeNode* B) { if(!A || !B)return false; return check(A,B) || isSubStructure(A->left,B) || isSubStructure(A->right,B); } };
结果
1 2 3 4 5 6 7 8 9 10 11 12 执行用时: 32 ms , 在所有 C++ 提交中击败了 91.49% 的用户 内存消耗: 32.8 MB , 在所有 C++ 提交中击败了 61.06% 的用户 通过测试用例: 48 / 48