给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。
示例 1:
给定的树 s:
3 / 4 5 / 1 2
给定的树 t:
4 / 1 2
返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值。
示例 2:
给定的树 s:
3 / 4 5 / 1 2 / 0
给定的树 t:
4 / 1 2
返回 false。
思路:一棵数包含另一棵树,有三种情况:
1.两棵树相等。
2.一棵树在另一棵树的左侧。
3.一棵树在另一棵树的右侧。
所以我们可以利用两次递归,来判断t是否是s的子树。
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * struct TreeNode *left; 6 * struct TreeNode *right; 7 * }; 8 */ 9 10 bool help(struct TreeNode* s, struct TreeNode* t) 11 { 12 if(s==NULL&&t==NULL){ 13 return true; 14 } 15 if(s==NULL||t==NULL){ 16 return false; 17 } 18 if(s->val!=t->val){ 19 return false; 20 } 21 return help(s->left,t->left)&&help(s->right,t->right); 22 } 23 24 bool isSubtree(struct TreeNode* s, struct TreeNode* t){ 25 if(s==NULL){ 26 return false; 27 } 28 return help(s,t)||isSubtree(s->left,t)||isSubtree(s->right,t); 29 }
原文:https://www.cnblogs.com/woju/p/12845781.html