树的子结构

1. 要有解决问题的步骤,层次感  (二叉树指针多,要判断指针是否为空)

1)先遍历二叉树,判断根节点是否一样;(没说明的情况能用递归就用递归)

 2)如果根节点一样,那么进一步向下判断下面所有的子树一样;

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
       bool result=false;
        
        if(pRoot1!=nullptr&&pRoot2!=nullptr)
        {
           if(pRoot1->val==pRoot2->val)  //类型要是double 可不能用== 得自己写个equal 函数     
            result =DoesTree1hasTree2( pRoot1, pRoot2); // result含义不同
           
            if(!result)//必须加上这句 如果结果没对  //因为上层即使根结点一样  也不一定完全匹配!!!! //和回溯有点像!!
               result=HasSubtree( pRoot1->left,  pRoot2);
            if(!result) 
               result=HasSubtree( pRoot1->right, pRoot2);
        

        }
        return result;//要是空指针也返回 false;

    }
public:
    //整个匹配;匹配上其实就是 直到把2节点遍历成空为止
   bool DoesTree1hasTree2(TreeNode* pRoot1, TreeNode* pRoot2) 
   {
     if(pRoot2==nullptr)     //把树2熬到头就赢了   //一开始不会是空树  因为上层调用已经限制过了!!
      return  true;
     if(pRoot1==nullptr)    //完了 树1先熬到头了   //把树1都遍历空了都没找到
      return  false;
     
     if(pRoot1->val!=pRoot2->val) //做判别
      return false ;
       //其他情况
       return DoesTree1hasTree2(pRoot1->left, pRoot2->left)&&DoesTree1hasTree2(pRoot1->right, pRoot2->right);
   }
    
};

 

posted @ 2019-08-20 22:06  高颖1995  阅读(136)  评论(0编辑  收藏  举报