# 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) ### 執行結果 ![image](https://hackmd.io/_uploads/H1ebbJJOT.jpg) --- ## 改良 + 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; } } }; ``` ![image](https://hackmd.io/_uploads/B1bWIFo1gx.png)