问题描述
笔记
首先写一个isIdentical的函数判断两个树是否完全一样。然后用递归,如果T1的左子树与T2相同或者T1的右子树与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 T1HasT2(TreeNode *T1, TreeNode *T2)
{
if (T1 == NULL && T2 != NULL)
return false;
if (T1 == NULL && T2 == NULL)
return true;
if (T1 != NULL && T2 == NULL)//T1 is not to the end, and T2 is end
return false;
if (T1 != NULL && T2 != NULL)
{
if (T1->val != T2->val)
return false;
return T1HasT2(T1->left, T2->left) && T1HasT2(T1->right, T2->right);
}
}
bool isSubtree(TreeNode *T1, TreeNode *T2)
{
// write your code here
if (T2 == NULL)
return true;
if (T1 == NULL)
return false;
if (T1 != NULL && T2 != NULL)
{
bool res = false;
if (T1->val == T2->val)
res = T1HasT2(T1, T2);
if (!res)
res = isSubtree(T1->left, T2);
if (!res)
res = isSubtree(T1->right, T2);
return res;
}
}
};
二次作战
/**
* 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
if (T2 == NULL)
return true;
if (T1 == NULL)
return false;
if (isIdentical(T1, T2))
return true;
return (isSubtree(T1->left, T2) || isSubtree(T1->right, T2) );
}
bool isIdentical(TreeNode* a, TreeNode* b)
{
if (a == NULL && b == NULL)
return true;
else if (a == NULL && b != NULL)
return false;
else if (a != NULL && b == NULL)
return false;
if (a->val != b->val)
return false;
return (isIdentical(a->left, b->left) && isIdentical(a->right, b->right));
}
};
三次练习
/**
* 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
if (T1 == NULL && T2 == NULL)
return true;
else if (T1 == NULL && T2 != NULL)
return false;
else if (T1 != NULL && T2 == NULL)
return true;
else
{
if (isIdentical(T1, T2))
return true;
return (isSubtree(T1->left, T2) || isSubtree(T1->right, T2));
}
}
bool isIdentical(TreeNode *T1, TreeNode *T2)
{
if (T1 == NULL && T2 == NULL)
return true;
else if (T1 == NULL && T2 != NULL)
return false;
else if (T1 != NULL && T2 == NULL)
return false;
else
{
if (T1->val != T2->val)
return false;
return (isIdentical(T1->left, T2->left) && isIdentical(T1->right, T2->right));
}
}
};