LeetCode 572. Subtree of Another Tree
原题链接在这里:https://leetcode.com/problems/subtree-of-another-tree/
题目:
Given two non-empty binary trees s and t, check whether tree t has exactly the same structure and node values with a subtree of s. A subtree of s is a tree consists of a node in s and all of this node's descendants. The tree s could also be considered as a subtree of itself.
Example 1:
Given tree s:
3 / \ 4 5 / \ 1 2
Given tree t:
4 / \ 1 2
Return true, because t has the same structure and node values with a subtree of s.
Example 2:
Given tree s:
3 / \ 4 5 / \ 1 2 / 0
Given tree t:
4 / \ 1 2
Return false.
题解:
Traverse s 的每个节点,看把该节点当成root的subtree是否与t identical.
如果s 和 t本身都是null, 那么t也算s的subtree, 因为null 是本身null 的subtree.
Time Complexity: O(m*n). m是s的节点数. n是t的节点数. 对于s的每一个节点都做了一次以该节点为root的subtree 与 t的比较.
Space: O(logm). stack space, 一直找不到的时候会走到s的底部.
AC Java:
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 public class Solution { 11 public boolean isSubtree(TreeNode s, TreeNode t) { 12 if(isSame(s, t)){ 13 return true; 14 } 15 return s!=null && (isSubtree(s.left, t) || isSubtree(s.right,t )); 16 } 17 18 private boolean isSame(TreeNode s, TreeNode t){ 19 if(s == null && t == null){ 20 return true; 21 } 22 23 if(s == null || t == null){ 24 return false; 25 } 26 27 if(s.val != t.val){ 28 return false; 29 } 30 31 return isSame(s.left, t.left) && isSame(s.right, t.right); 32 } 33 }
AC C++:
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode() : val(0), left(nullptr), right(nullptr) {} 8 * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} 9 * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} 10 * }; 11 */ 12 class Solution { 13 public: 14 bool isSubtree(TreeNode* root, TreeNode* subRoot) { 15 if(isSame(root, subRoot)){ 16 return true; 17 } 18 19 return root && (isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot)); 20 } 21 22 bool isSame(TreeNode* p, TreeNode* q){ 23 if(!p && !q){ 24 return true; 25 } 26 27 if(!p || !q){ 28 return false; 29 } 30 31 return p->val == q->val && isSame(p->left, q->left) && isSame(p->right, q->right); 32 } 33 };
AC Python:
1 # Definition for a binary tree node. 2 # class TreeNode: 3 # def __init__(self, val=0, left=None, right=None): 4 # self.val = val 5 # self.left = left 6 # self.right = right 7 class Solution: 8 def isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool: 9 if self.isSame(root, subRoot): 10 return True 11 return root and (self.isSubtree(root.left, subRoot) or self.isSubtree(root.right, subRoot)) 12 def isSame(self, p, q): 13 if not p and not q: 14 return True 15 if not p or not q: 16 return False 17 if p.val != q.val: 18 return False 19 return self.isSame(p.left, q.left) and self.isSame(p.right, q.right) 20
对s 和 t 分别做preorder traversal, 然后看t得到的string 是不是 s得到string的 substring.
遇到null TreeNode时要添加特别符号, 不然就不能区分 123, null, null 和 1, 2, 3. 也无法区分 1, null, 2 和 1, 2, null. 这两种情况.
Time Complexity: O(m+n). m是s的节点数. n是t的节点数.
Space: O(Math.max(m, n)). StringBuilder space.
AC Java:
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode() {} 8 * TreeNode(int val) { this.val = val; } 9 * TreeNode(int val, TreeNode left, TreeNode right) { 10 * this.val = val; 11 * this.left = left; 12 * this.right = right; 13 * } 14 * } 15 */ 16 class Solution { 17 public boolean isSubtree(TreeNode root, TreeNode subRoot) { 18 String sPreorder = preorderTraversal(root); 19 String tPreorder = preorderTraversal(subRoot); 20 21 return sPreorder.contains(tPreorder); 22 } 23 24 private String preorderTraversal(TreeNode root){ 25 StringBuilder sb = new StringBuilder(); 26 Stack<TreeNode> stk = new Stack<TreeNode>(); 27 stk.push(root); 28 while(!stk.isEmpty()){ 29 TreeNode tn = stk.pop(); 30 if(tn == null){ 31 sb.append(",#"); 32 }else{ 33 sb.append(","+tn.val); 34 stk.push(tn.right); 35 stk.push(tn.left); 36 } 37 } 38 return sb.toString(); 39 } 40 }
AC Python:
1 # Definition for a binary tree node. 2 # class TreeNode: 3 # def __init__(self, val=0, left=None, right=None): 4 # self.val = val 5 # self.left = left 6 # self.right = right 7 class Solution: 8 def isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool: 9 rootPreorder = self.preorder(root) 10 subRootPreorder = self.preorder(subRoot) 11 return subRootPreorder in rootPreorder 12 def preorder(self, root): 13 res = [] 14 self.dfs(root, res) 15 return "".join(res) 16 def dfs(self, root, res): 17 if not root: 18 res.append(",#") 19 return 20 res.append(f",{root.val}") 21 self.dfs(root.left, res) 22 self.dfs(root.right, res)