有两个不同大小的二进制树: T1
有上百万的节点; T2
有好几百的节点。请设计一种算法,判定 T2
是否为 T1
的子树。
注意事项
若 T1 中存在从节点 n 开始的子树与 T2 相同,我们称 T2 是 T1 的子树。也就是说,如果在 T1 节点 n 处将树砍断,砍断的部分将与 T2 完全相同。
样例
下面的例子中 T2 是 T1 的子树:
1 3
/ \ /
T1 = 2 3 T2 = 4
/
4
下面的例子中 T2 不是 T1 的子树:
1 3 / \ \ T1 = 2 3 T2 = 4 /
4
解题思路:因为数据很水,直接运用以前两树进行匹配的代码,边搜索边匹配,并用flag进行标记,如果成功就跳出,注意一下特殊情况,级T1和T2是空树的情况即可。
class Solution { public: /** * @param T1, T2: The roots of binary tree. * @return: True if T2 is a subtree of T1, or false. */ bool ans=1,Ans=0; bool same(TreeNode *a,TreeNode *b){ if(ans==0)return 0; if(a!=NULL&&b!=NULL){ if(a->val!=b->val){ ans=0; return 0; } else { same(a->left,b->left); same(a->right,b->right); return ans; } } if(a!=NULL&&b==NULL){ans=0;return 0;} if(b!=NULL&&a==NULL){ans=0;return 0;} return ans; } bool dfs(TreeNode *T1,TreeNode *T2){ if(T1==NULL)return Ans; ans=1; if(same(T1,T2))Ans=1; if(Ans==1)return Ans; dfs(T1->left,T2); dfs(T1->right,T2); } bool isSubtree(TreeNode *T1, TreeNode *T2) { // write your code here if(T2==NULL)return 1; if(T1==NULL)return 0; return dfs(T1,T2); } };