对于两棵彼此独立的二叉树A和B,请编写一个高效算法,检查A中是否存在一棵子树与B树的拓扑结构完全相同。
给定两棵二叉树的头结点A和B,请返回一个bool值,代表A中是否存在一棵同构于B的子树。
思路:检测树的叶子结点是否为空,只有状态相同即可。
class IdenticalTree {
public:
bool chkIdentical(TreeNode* A, TreeNode* B) {
// write code here
if (A == NULL && B != NULL) { //这句不能掉,否则可能会抛出空指针异常
return false;
}
if (isIdentical(A, B)) {
return true;
}
if (chkIdentical(A->left, B)) {
return true;
} else if (chkIdentical(A->right, B)) {
return true;
}
return false;
}
bool isIdentical(TreeNode* A, TreeNode* B) {
if (A == NULL && B == NULL) {
return true;
}
if (A == NULL || B == NULL) {
return false;
}
return A->val == B->val && isIdentical(A->left, B->left) && isIdentical(A->right, B->right);
}
};
另一种思路:将其转化为字符串,从中找相同的子串,如果存在,则true,否则false
#include<iostream>
#include<vector>
#include<string>
#include<map>
usingnamespacestd;
struct TreeNode{
int val;
struct TreeNode* left;
struct TreeNode* right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
class IdenticalTree{
public:
bool chkIdentical(TreeNode* A, TreeNode* B)
{
string s1=toString(A),s2=toString(B);
if(s1.find(s2)!=string::npos)
return true;
else
return false;
}
stringtoString(TreeNode* root)
{
string res;
Serialize(root,res);
returnres;
}
voidSerialize(TreeNode* root,string &res)
{
if(!root)
{
res+="#!";
return;
}
res+=IntegertoStr((*root).val);
Serialize((*root).left,res);
Serialize((*root).right,res);
}
stringIntegertoStr(int m)
//!×öΪ½áÊø·û
{
if(!m)
return"0!";
string res;
vector temp;
while(m)
{
temp.push_back(m%10);
m=m/10;
}
for(vector::reverse_iterator riter=temp.rbegin();riter!=temp.rend();riter++)
res.push_back(*riter+48);
res.push_back('!');
return res;
}
};