题目描述
给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。
二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。
提示
root 树上的节点数量范围是 [1, 2000]
subRoot 树上的节点数量范围是 [1, 1000]
-104 <= root.val <= 104
-104 <= subRoot.val <= 104
错误示范
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
bool dfs(TreeNode *cur, TreeNode *subRoot, TreeNode *subcur) {
//cur 当前树遍历的位置
//subRoot子树的根,保持不变
//subcur 当前子树遍历的位置
if (nullptr == cur && nullptr == subcur) return true;
else if (nullptr == cur && nullptr != subcur) {
return false;
}
/*-----------------------从此处开始--------------------------*/
else if (nullptr != cur && nullptr == subcur) {
return dfs(cur, subRoot, subRoot);
}
else if (cur->val != subcur->val) {
if (subcur != subRoot) return dfs(cur, subRoot, subRoot);
else return dfs(cur->left, subRoot, subRoot) || dfs(cur->right, subRoot, subRoot);
}
/*-----------------------到此处结束--------------------------*/
else {
return dfs(cur->left, subRoot, subcur->left) && dfs(cur->right, subRoot, subcur->right);
}
}
public:
bool isSubtree(TreeNode* root, TreeNode* subRoot) {
if (nullptr == subRoot) return true;
return dfs(root, subRoot, subRoot);
}
};
代码标注处,实际上漏算了一部分可能性,中一些节点可能会被直接放弃。
正确解答(暴力搜索)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
bool flag = false;
bool dfs(TreeNode *root, TreeNode *subRoot) {
if (nullptr == root && nullptr == subRoot) return true;
else if (nullptr == root && nullptr != subRoot || nullptr != root && nullptr == subRoot || root->val != subRoot->val) return false;
else {
return dfs(root->left, subRoot->left) && dfs(root->right, subRoot->right);
}
}
public:
bool isSubtree(TreeNode* root, TreeNode* subRoot) {
if (flag) return true;
if (!dfs(root, subRoot)) {
if (nullptr != root) return isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);
else return flag;
}
else {
flag = true;
return flag;
}
}
};