题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
分析:要做题,先要理解题目的意思。首先我们先理解什么是子结构,这里的子结构不是说B只有根节点和A的某一节点相连接,而是B中可能有2个以上的节点和A中节点相连接。还有一点,A中可能有多个节点值和B的根节点的值相同,所以可能要找出所有A中节点值和B根节点值相同的情况,直到判定B是A的子结构时结束。我的方法是:
a.先遍历A的所有节点,且全部保存在数组里;
b.找到A中节点值和B的根节点值相同的节点;
c.遍历B中节点,判断与之对应的A节点值是否相同,相同则继续,否则返回false(递归);
d.c结果返回false,则继续c,d步骤;
本文的方法可能有些笨拙,写出了是给各位奋斗中的小伙伴一个参考思路,共同努力!
程序:
//先序遍历二叉树;
inline void preorder(TreeNode* t, vector<TreeNode*> &temp){
if (!t) return;
temp.push_back(t);
if (t->left) preorder(t->left, temp);
if (t->right) preorder(t->right, temp);
}
//t1节点值和t2节点值相同,判断t1是否包含t2;
inline bool isequal(TreeNode *t1, TreeNode * t2){
if (t1->val != t2->val) return false;
if (t2->left&&!t1->left) return false;
if (t2->right&&!t1->right) return false;
if(t2->left&&t2->right) return isequal(t1->left, t2->left)&&isequal(t1->right,t2->right);
else if (t2->left) return isequal(t1->left, t2->left);
else if (t2->right) return isequal(t1->right, t2->right);
else return true;
}
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if (!pRoot1 || !pRoot2) return false; //空树不是任何树的子结构;
vector<TreeNode*> t1;
preorder(pRoot1, t1); //遍历pRoot1二叉树,节点保存在t1容器中;
int i = 0;
while (i<t1.size()){
if (pRoot2->val == t1[i]->val){
if (isequal(t1[i], pRoot2)) return true;
}
i++;
}
return false;
}