问题描述:
有两个不同大小的二进制树: T1
有上百万的节点; T2
有好几百的节点。请设计一种算法,判定 T2
是否为T1
的子树。
样例:
下面的例子中 T2 是 T1 的子树:
1 3
/ \ /
T1 = 2 3 T2 = 4
/
4
下面的例子中 T2 不是 T1 的子树:
1 3
/ \ \
T1 = 2 3 T2 = 4
/
4
解题思路:
给定两棵树,按照前序遍历的方式分别存在两个数组里,然后找从第一个数组找和第个数组的第一个相同的元素,找到后判断后面的是否与第二个数组完全相同。
代码:
/**
* 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.
*/
TreeNode *T= new TreeNode(0) ;
vector<TreeNode*> t1, t2;
void PreorderTraversal(TreeNode *root, bool a) {
if (root== NULL) {
if (a== 0) {
t1.push_back(T);
} else {t2.push_back(T);}
return;
}
if (a== 0) {
t1.push_back(root);
} else {t2.push_back(root);}
PreorderTraversal(root->left, a);
PreorderTraversal(root->right, a);
}
bool isSubtree(TreeNode *T1, TreeNode *T2) {
// write your code here
PreorderTraversal(T1, 0);
PreorderTraversal(T2, 1);
int j1;
int a= 0;
for (int j=0; j< t1.size(); j++) {
j1= j;
int c= 1;
if (t1[j1]->val== t2[0]->val) {
j1++;
for (int i= 1; i< t2.size(); i++) {
if (t1[j1]->val!= t2[i]->val) {
c= 0; break;
}
j1++;
}
if (c== 1) {a= 1; break;}
}
}
if (a== 0) {return 0;} else {return 1;}
}
};
感想:
遍历加上数组的遍历查找。