lintcode.245 子树
Posted 会飞的雅蠛蝶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lintcode.245 子树相关的知识,希望对你有一定的参考价值。
有两个不同大小的二进制树: 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
很神奇的一道题,有个样例是{9,9,9,9,9,9,9.......},会卡住。
就是说开始判断时,子树为空有的节点,树上也不能有,否则就不是子树了。一开始一直没想明白。
AC代码,
/** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int val) { * this->val = val; * this->left = this->right = NULL; * } * } */ class Solution { public: /* * @param T1: The roots of binary tree T1. * @param T2: The roots of binary tree T2. * @return: True if T2 is a subtree of T1, or false. */ bool isSubtree(TreeNode *T1, TreeNode *T2) { bool result = false; if (T2 == NULL) { return true; } if (T1 == NULL) { return false; } if (T1->val == T2->val) { result = hasSubtree(T1,T2); } if (!result) { result = isSubtree(T1->left,T2); } if (!result) { result = isSubtree(T1->right,T2); } return result; } bool hasSubtree(TreeNode *T1, TreeNode *T2) { if(T2==NULL && T1==NULL) return true; if (T1 != NULL && T2!=NULL && T1->val == T2->val) { return hasSubtree(T1->left,T2->left) && hasSubtree(T1->right,T2->right); } return false; } };
很尴尬的是,同样的代码,会runtime error。
代码如下:
/** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int val) { * this->val = val; * this->left = this->right = NULL; * } * } */ class Solution { public: /** * @param T1, T2: The roots of binary tree. * @return: True if T2 is a subtree of T1, or false. */ bool isSubtree(TreeNode *T1, TreeNode *T2) { // write your code here bool res= false; if(T2 == NULL) return true; if(T1 == NULL) return false; if(T1 -> val == T2 -> val) res = cmp(T1,T2); if(!res) res=isSubtree(T1->left,T2); if(!res) res=isSubtree(T1->right,T2); return res; } bool cmp(TreeNode *T1,TreeNode *T2){ if(T2 == NULL && T1 == NULL) return true; if(T1 -> val == T2 -> val && T1 != NULL && T2 != NULL) return cmp(T1->left,T2->left) && cmp(T1->right,T2->right); return false; } };
这就很尴尬了,我也不知道咋回事。。。求大佬指点
以上是关于lintcode.245 子树的主要内容,如果未能解决你的问题,请参考以下文章