剑指offer Leetcode 26.树的子结构

image-20201204180552989

解法:迭代

思想:

​ 遍历A的每个节点,只要以任一节点为根的树”包含“B,就成功

注意:

​ ●isSubStructure中,题目中说了空树不是任一树的子结构,要注意,要与面试官沟通空树的情况

​ ●iscontain中,A需要包含B,所以B有的A一定要有,B无的A无所谓

代码:

class Solution {
    
    
public:
    bool isSubStructure(TreeNode* A, TreeNode* B) {
    
    
        //题目中说了空树不是任一树的子结构
        if(B == NULL || A == NULL)
            return false;
        //A以当前节点包含B就返回true,如果不包含,说明当前节点没用,用A的left和right来判断
        //我一开始写成三个iscontain了,感觉还是有点混乱,要记住
        return iscontain(A, B) || isSubStructure(A->left, B) || isSubStructure(A->right, B);
    }
    //包含:以A为根的数是否包含B(必须从A开始)
    bool iscontain(TreeNode* A, TreeNode* B){
    
    
        //B为空,A无所谓,返回true
        if(B == NULL)
            return true;
        //此时B不为空,A为空或者值不相等,返回false
        if(A == NULL || A->val != B->val)
            return false;
        //当前节点成功,两个子节点都成功的话,就返回true
        return iscontain(A->left, B->left) && iscontain(A->right, B->right);
    }
};

猜你喜欢

转载自blog.csdn.net/qq_36459662/article/details/113854102