剑指offer-输入两棵二叉树A,B,判断B是不是A的子结构(ps:我们约定空树不是任意一个树的子结构)

来源:互联网 发布:unity3d百度地图映射 编辑:程序博客网 时间:2024/05/16 06:27

写在前面:最近要找工作了,所以刷刷题,代码可能大家的都很差不多,但我作为一个不经常使用C++的人来说,会写下一个作为C++新手的感受,希望对大家有所帮助吧。一起学习,共同进步。
输入两棵二叉树A,B,判断B是不是A的子结构(ps:我们约定空树不是任意一个树的子结构)

/*
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)
{
bool result=false;//声明函数返回变量
//为了保证代码的鲁棒性,最好先判断两个根节点是否为空
if(pRoot1!=NULL && pRoot2!=NULL){
if(pRoot1->val==pRoot2->val)
result=DoesTree1HaveTree2(pRoot1,pRoot2);//当两个根结点相同的时候,进行下一步判断,看左右子节点是否相等
if(!result)
result=HasSubtree(pRoot1->left,pRoot2);
if(!result)
result=HasSubtree(pRoot1->right,pRoot2);
}
return result;
}
//判断在根节点相同的情况下,左右子节点是否相等(PS:前面那么多if只是为了保证代码的稳定性,避免错误调用时程序崩溃)
//实际上,每一颗子结点也可以看成一个没有子结点的根节点
bool DoesTree1HaveTree2(TreeNode* pRoot1,TreeNode* pRoot2){
if(pRoot2==NULL) return true;//这要和题目中的PS区分开,因为调用这一步的时候 pRoot2肯定不是空了,实际上这时候pRoot2=pRoot2->left or right
if(pRoot1==NULL) return false
if(pRoot1->val!=pRoot2->val) return false;
return DoesTree1HaveTree2(pRoot1->left,pRoot2->left)&&
DoesTree1HaveTree2(pRoot1->right,pRoot2->right);//使用递归
}
};
这题主要分两步,一判断根结点,二判断左右子节点,方法采用递归,最重要的是,一定要判断结点是否为空,否则肯定会遭到面试官的鄙视

阅读全文
0 0