-------------------2020/12/26二刷-------------------
递归博大精深
----------------------一刷-----------------------------
题目描述
解法 前序遍历递归法
前序遍历遍历树中的每一个结点,以该结点为根结点,再次左右子树递归比较比较此树与子树是否相同
/**
* 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==NULL || B==NULL) return false;
return (treeCompare(A,B) || isSubStructure(A -> left, B) || isSubStructure(A -> right,B));//前序遍历每一个结点对应的子树
}
bool treeCompare(TreeNode* A, TreeNode* B)
{
if(B == NULL) return true;//遍历过程中B无更多结点,说明B为A子树
if(A == NULL) return false;//遍历过程中A无更多结点,说明B不为A子树
//必须先判断B再判断A,因为两者可能同时为空,这时也说明B为A子树
return (A -> val == B -> val && treeCompare(A -> left, B -> left) && treeCompare(A->right, B->right));//利用前序遍历比较子树内的结点是否相同
}
};
缺点------没有剪枝,比如发现以该结点为根结点的子树高度已经小于树B时,就没有比较的必要了。(但并不知道这样剪枝会不会更快,毕竟还要先计算树的高度)
时间复杂度O(MN) 空间复杂度O(M),B树退化为链表时,递归深度最大为M