剑指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);
    }
};
原文地址:https://www.cnblogs.com/BillowJ/p/12722022.html