树的子结构

输入两棵二叉树A和B,判断B是不是A的子结构。B是A的子结构, 即 A中有出现和B相同的结构和节点值。

思路:

遍历树A,如果当前节点p和树B的根节点r相同,则以树A的当前节点p为起始点,树B的根节点r为起始点进行遍历匹配。如果结果返回false,则继续遍历p左子树和右子树,重复上面的过程。

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    //判断树B是否是以A为根节点的树是否匹配
    bool isSubTree(TreeNode* A, TreeNode* B) {
        if(B == nullptr) {
            return true;
        }
        if(A == nullptr) {
            return false;
        }
        if(A->val != B->val) {
            return false;
        }
        return isSubTree(A->left,B->left) && isSubTree(A->right,B->right);
    }
    //主要函数
    bool isSubStructure(TreeNode* A, TreeNode* B) {
        if(B == nullptr || A == nullptr) return false;

        bool result = false;
        if(A->val == B->val) {
            result = isSubTree(A,B);
        }
        if(!result) {
            result = isSubStructure(A->left,B);
        }
        if(!result) {
            result = isSubStructure(A->right,B);
        }
        return result;
    }
};