题目来源:LintCode
原题地址:http://www.lintcode.com/zh-cn/problem/subtree/#
题目:
有两个不同大小的二进制树: T1
有上百万的节点; T2
有好几百的节点。请设计一种算法,判定 T2
是否为 T1
的子树。
Yes
样例
下面的例子中 T2 是 T1 的子树:
1 3
/ \ /
T1 = 2 3 T2 = 4
/
4
下面的例子中 T2 不是 T1 的子树:
1 3
/ \ \
T1 = 2 3 T2 = 4
/
4
注意
若 T1 中存在从节点 n 开始的子树与 T2 相同,我们称 T2 是 T1 的子树。也就是说,如果在 T1 节点 n 处将树砍断,砍断的部分将与 T2 完全相同。
难度级别:
容易
容易
思路分析:
本题采用的策略其实很简单,就是选择一个常用的树的遍历方式,对每个节点进行遍历操作;
对于每个节点都进行对比操作,看看是否从当前节点开始是否是子树。
本题采用的策略其实很简单,就是选择一个常用的树的遍历方式,对每个节点进行遍历操作;
对于每个节点都进行对比操作,看看是否从当前节点开始是否是子树。
实现代码:
/**
* 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)
{
if (T1 == NULL && T2 == NULL)
{
return true;
}else if (T1 == NULL && T2 != NULL)
{
return false;
}
if (isSubtreeCore(T1, T2))
{
return true;
}
if (isSubtree(T1->left, T2))
{
return true;
}
if (isSubtree(T1->right, T2))
{
return true;
}
return false;
}
bool isSubtreeCore(TreeNode *T1, TreeNode *T2)
{
if (T1 == NULL && T2 == NULL)
{
return true;
}
if (T1 == NULL || T2 == NULL)
{
return false;
}
if (T1->val != T2->val)
{
return false;
} else
{
if (!isSubtreeCore(T1->left, T2->left))
{
return false;
}
if (!isSubtreeCore(T1->right, T2->right))
{
return false;
}
}
return true;
}
};
代码说明:
其实这个代码挺简单的,需要说明的是:
我原先习惯如果下一个节点为空的话 就不进入了,不过此题的情况比较特殊,会有子树为空的情况,所以不能这么处理。
所以不管是否为空都要进入下一个节点。
或者 把空子树这个情况单列出来进行处理,也是可以的。
其实这个代码挺简单的,需要说明的是:
我原先习惯如果下一个节点为空的话 就不进入了,不过此题的情况比较特殊,会有子树为空的情况,所以不能这么处理。
所以不管是否为空都要进入下一个节点。
或者 把空子树这个情况单列出来进行处理,也是可以的。