树的子结构
1. 要有解决问题的步骤,层次感 (二叉树指针多,要判断指针是否为空)
1)先遍历二叉树,判断根节点是否一样;(没说明的情况能用递归就用递归)
2)如果根节点一样,那么进一步向下判断下面所有的子树一样;
/* 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!=nullptr&&pRoot2!=nullptr) { if(pRoot1->val==pRoot2->val) //类型要是double 可不能用== 得自己写个equal 函数 result =DoesTree1hasTree2( pRoot1, pRoot2); // result含义不同 if(!result)//必须加上这句 如果结果没对 //因为上层即使根结点一样 也不一定完全匹配!!!! //和回溯有点像!! result=HasSubtree( pRoot1->left, pRoot2); if(!result) result=HasSubtree( pRoot1->right, pRoot2); } return result;//要是空指针也返回 false; } public: //整个匹配;匹配上其实就是 直到把2节点遍历成空为止 bool DoesTree1hasTree2(TreeNode* pRoot1, TreeNode* pRoot2) { if(pRoot2==nullptr) //把树2熬到头就赢了 //一开始不会是空树 因为上层调用已经限制过了!! return true; if(pRoot1==nullptr) //完了 树1先熬到头了 //把树1都遍历空了都没找到 return false; if(pRoot1->val!=pRoot2->val) //做判别 return false ; //其他情况 return DoesTree1hasTree2(pRoot1->left, pRoot2->left)&&DoesTree1hasTree2(pRoot1->right, pRoot2->right); } };