树的子结构
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
1、排除B为空树情况。
2、进入子结构判断函数,发现父节点相同,则判断后者是否为前者的开始结构。是则返回true。
3、判断是否为左子树的子结构,判断是否为右子树的子结构。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if((!pRoot1)||(!pRoot2)) return false;//排除空树
return isSubtree(pRoot1,pRoot2);
}
private:
//判断树2是不是与树1的开始结构
bool isBeg(TreeNode *pRoot1, TreeNode *pRoot2){
stack<TreeNode*> st1,st2;
st1.push(pRoot1);
st2.push(pRoot2);
while(!st2.empty()){
TreeNode *cur1=st1.top(),*cur2=st2.top();
st1.pop();
st2.pop();
if(cur1->val!=cur2->val){
return false;
}
if(cur1->right&&cur2->right){
st1.push(cur1->right);
st2.push(cur2->right);
}
else if(cur2->right){//A提前变空,B未空
return false;
}
if(cur1->left&&cur2->left){
st1.push(cur1->left);
st2.push(cur2->left);
}
else if(cur2->left){//A提前变空,B未空
return false;
}
}
return true;
}
//子结构判断
bool isSubtree(TreeNode *pRoot1, TreeNode *pRoot2){
if(pRoot1->val==pRoot2->val){
if(isBeg(pRoot1,pRoot2)){
return true;
}
}
if(pRoot1->left&&pRoot2){
return isSubtree(pRoot1->left,pRoot2);
}
if(pRoot1->right&&pRoot2){
return isSubtree(pRoot1->right,pRoot2);
}
return false;
}
};
注意:在线编程如果一直找不出段错误原因,可以尝试将部分逻辑代码重新敲一遍。
第一次上榜,纪念一下:
另外,伟大的雷神加班牺牲,顿时觉得以后我们要爱惜自己的身体。希望雷神一路走好。