剑指offer:树的子结构
题目描述
输入两棵二叉树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 issubtree(TreeNode* p1, TreeNode* p2){ if(p2 == nullptr) return true; if(p1 == nullptr) return false; if(p1 -> val == p2 -> val){ return issubtree(p1 -> left, p2 -> left) && issubtree(p1 -> right, p2 -> right); }else return false; } bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) { if(pRoot2 == nullptr || pRoot1 == nullptr) return false; return HasSubtree(pRoot1 -> left, pRoot2) || HasSubtree(pRoot1 -> right, pRoot2) || issubtree(pRoot1, pRoot2); } };