【剑指offer】【树】26.树的子结构

题目链接:https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof/

递归

从根节点开始递归判断A和B的节点是不是相等;
1) 如果A或B为空,则返回false
2) 否则,使用isSame依次判断A和B中节点是否相等
3)不相等,递归判断A的左右节点是否与B的根节点匹配
isSame如何进行判断:
1)如果B为空, 则匹配
2)如果A为空或者A当前节点的值与B不相等,返回false
3)如果根节点相等,递归判断A的右子树与B的右子树 A的左子树和B的左子树是否相等

/**
 * 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:
    bool isSubStructure(TreeNode* A, TreeNode* B) {
        if(!A || !B) return false;
        //遍历树A中的所有非空节点R;
        if(isSame(A, B)) return true;
        //判断树A中以R为根节点的子树是不是包含和树B一样的结构,且我们从根节点开始匹配;
        return isSubStructure(A->left, B) || isSubStructure(A->right, B);
    }
    bool isSame(TreeNode *A, TreeNode *B){
        //如果树B中的节点为空,则表示当前分支是匹配的,返回true;
        if(!B) return true;
        //如果树A中的节点为空,但树B中的节点不为空,则说明不匹配,返回false;
        if(!A || A->val != B->val) return false;
        //如果两个节点都不为空,但数值不同,则说明不匹配,返回false;
        return isSame(A->left, B->left) && isSame(A->right, B->right);
    }
};
posted @ 2020-04-07 20:41  NaughtyCoder  阅读(80)  评论(0)    收藏  举报