剑指 Offer 26. 树的子结构
题目描述
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:
给定的树 A:
3
/ \
4 5
/ \
1 2
给定的树 B:
4
/
1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
样例
输入:A = [1,2,3], B = [3,1]
输出:false
算法
(dfs) O(mn)O(mn)O(mn)
可以看做树形字符串暴力匹配,将问题考虑周群即可AC
C++ 代码
/**
* 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:
vector<TreeNode*> v;
bool flag;
bool dfs(TreeNode* A, TreeNode* B) {
if (!A && !B) return true;
if (A && B && A->val == B->val) return dfs(A->left, B->left) && dfs(A->right, B->right);
if (A && !B)return true; // 第一次WA在了这里,要注意
return false;
}
void find(TreeNode* A, TreeNode* B) {
if (!A) return ;
if (A->val == B->val)
v.push_back(A);
find(A->left, B);
find(A->right, B);
}
bool isSubStructure(TreeNode* A, TreeNode* B) {
if (!B) return false;
find(A, B);
flag = false;
for (auto p : v) {
flag = dfs(p->left, B->left) && dfs(p->right, B->right);
if (flag) break;
}
return flag;
}
};
本文解析如何使用深度优先搜索(DFS)算法判断二叉树B是否为二叉树A的子结构。通过递归实现节点值和结构的匹配,理解如何在C++中编写并优化代码。
362

被折叠的 条评论
为什么被折叠?



