//1.若树2为空,那么无论树1是否为空,树2都是树1的子树,返回true //2.若树2不为空,而树1为空,那么树2不可能是树1的子树,返回false //3.在树1树2都不为空的时候,就分三种情况, // 要么两棵树完全一样,用 issame(root1, root2)判断 // 要么树2属于树1的左子树,用递归判断 iscontains(root1->left, root2) // 要么树2属于树1的右子树,用递归判断 iscontains(root1->right, root2) #include<stdbool.h> // 判断两棵树是否完全一样 bool IsSame(struct TreeNode* r1, struct TreeNode* r2){ if(r1 == NULL && r2 == NULL) return true; // 两棵都是空树,肯定是一样的啦 else if(r1 == NULL || r2 == NULL) return false; //只有一棵树是空树时,必定不是一样的了 else if(r1->val != r2->val) return false; //两棵都不是空树,但值不一样,也不是same啦 return IsSame(r1->left, r2->left) && IsSame(r1->right, r2->right); //递归判断左子树和右子树是否完全一毛一样,只有都为真时才是完全相同 } bool isContains(struct TreeNode* root1, struct TreeNode* root2 ) { if(root2 == NULL) return true; else if(root1 == NULL) return false; return isContains(root1->left, root2) || isContains(root1->right, root2) || IsSame(root1, root2); }