# Leetcode [No. 572] Subtree of Another Tree (EASY)
## 題目
https://leetcode.com/problems/subtree-of-another-tree/description/
## 思路
+ 這個解法主要是把問題拆為兩個步驟:
+ 第一個步驟是先去traverse這顆tree,直到他們的root是相同的
+ 第二個步驟是當他們的頭相同後,我們再去比較他們的子樹是否相同
+ 如果不相同的話,我們就去判斷root的子樹有沒有可能會成功這樣~
```c++=
/**
* 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 {
public:
bool isSubtree(TreeNode* root, TreeNode* subRoot)
{
// if subRoot is null, it must be the subtree of the root.
if(subRoot == nullptr)
{
return true;
}
// but if root is null, it would not have any subtree.
if(root == nullptr)
{
return false;
}
if(isSameTree(root, subRoot))
{
return true;
}
// else traverse to the left node and right node
return isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);
}
bool isSameTree(TreeNode* root, TreeNode* subRoot)
{
if(root == subRoot) // both of them are nullptr
{
return true;
}
else if(!root && subRoot || root && !subRoot)
{
return false;
}
return root->val == subRoot->val && isSameTree(root->left, subRoot->left) && isSameTree(root->right, subRoot->right);
}
};
```
### 解法分析
+ time complexity: O(n*m)
### 執行結果

---
## 改良
+ DFS裡面的function很重要,因為只要有一個node是true就是true,所以要用OR來return.
```c++=
class Solution {
public:
bool isSubtree(TreeNode* root, TreeNode* subRoot) {
return dfs(root, subRoot);
}
bool dfs(TreeNode* root, TreeNode* subRoot) {
if (!root) return false;
if (root->val == subRoot->val && isSameTree(root, subRoot)) {
return true;
}
return dfs(root->left, subRoot) || dfs(root->right, subRoot);
}
// copy from q100.
bool isSameTree(TreeNode* p, TreeNode* q) {
if (p == q) return true; // both null
if (p && q) {
return p->val == q->val && isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
} else {
// one is null and other not
return false;
}
}
};
```
