⭐️ 题目描述
🌟 leetcode链接:另一棵树的子树
思路:
本题和 leetcode 100.相同的树
类似,是一道变形题。✨ leetcode 100.相同的树
解析与代码链接:【往期文章】leetcode 100.相同的树。本题只需要遍历二叉树每一个节点,把每一个节点都当一颗新的子树 root
在判断当前 root
与 subroot
是相同子树即可。
1️⃣ 代码:
/*
思路:让每一个节点都当作根节点与子树判断是否是相同的树即可。
*/
// 判断两颗树是否相同
bool isSame (struct TreeNode* tree1 , struct TreeNode * tree2) {
if (tree1 == NULL && tree2 == NULL) {
return true;
}
if (tree1 == NULL || tree2 == NULL) {
return false;
}
if (tree1->val != tree2->val) {
return false;
}
return isSame(tree1->left , tree2->left) && isSame(tree1->right , tree2->right);
}
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
// 当前子树为空 返回false
if (root == NULL) {
return false;
}
// 判断当前根节点和子树是否是相同的树
bool rootResult = isSame(root , subRoot);
if (rootResult) {
return true;
}
// 递归遍历左子树
bool leftTreeResult = isSubtree(root->left , subRoot);
if (leftTreeResult) {
return true;
}
// 递归遍历右子树
bool rightTreeResult = isSubtree(root->right , subRoot);
if (rightTreeResult) {
return true;
}
return false;
}
2️⃣ 代码:
// 判断两颗树是否相同
bool isSame (struct TreeNode* tree1 , struct TreeNode * tree2) {
if (tree1 == NULL && tree2 == NULL) {
return true;
}
if (tree1 == NULL || tree2 == NULL) {
return false;
}
if (tree1->val != tree2->val) {
return false;
}
return isSame(tree1->left , tree2->left) && isSame(tree1->right , tree2->right);
}
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
// 当前子树为空 返回false
if (root == NULL) {
return false;
}
// 判断当前根节点和子树是否是相同的树
bool rootResult = isSame(root , subRoot);
if (rootResult) {
return true;
}
return isSubtree(root->left , subRoot) || isSubtree(root->right , subRoot);
}