剑指offer面试题26树的子结构

1.题目描述:

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

2.设计思想

第一步是在树A种查找与B根节点值一样的节点,这实际就是二叉树的遍历

bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
       bool hasSubTree=false;
       
      if(pRoot1!=nullptr&&pRoot2!=nullptr)//若pRoot1和pRoot2都空则按照约定非子结构。若仅其中之一为空,非子结构
      {     
     if(Equalval(pRoot1->val,pRoot2->val))//若目前查找的子树二者根节点值相等,就继续在二者对应子树查下去是不是后面的对应节点也星等,
     //若连子树根节点都不同,子树下面的也没必要查了
       hasSubTree=DoesHave(pRoot1,pRoot2);
     
     //若两子树根节点不同,则试下A的左子树有B的相同结构不?
     if(!hasSubTree)
      hasSubTree=HasSubtree(pRoot1->left,pRoot2);
      
      //若两子树根节点不同,A的左子树也不存在B的相同结构,再到A的右子树看下
        if(!hasSubTree)
        hasSubTree=HasSubtree(pRoot1->right,pRoot2);
       }
        return hasSubTree;
    }

第二步判断A中以R为根节点的树是不是和B有完全相同的结构

bool DoesHave(TreeNode*TreeNode1,TreeNode*TreeNode2)
    {
     if(TreeNode2==nullptr)//TreeNode2的这颗子树已经便利顺利完,TreeNode1中也存在相同的子树
         return true;
        if(TreeNode1==nullptr)//比着比着TreeNode2不空,TreeNode1空了。显然二者的这颗子树也不同
            return false;
        
        if(!Equalval(TreeNode1->val,TreeNode2->val))
           return false;
        else
             return (DoesHave(TreeNode1->left,TreeNode2->left))&&(DoesHave(TreeNode1->right,TreeNode2->right));
    }

关于判断两个节点的值是否相等,不能直接pRoot1->val==pRoot2->val。因为计算机中表示小数时候(包括float和double),有误差,判断两个小数是否相等,只能判断二者差的绝对值是否在一个很小的范围内

bool Equalval(double num1, double num2)
{
    if((num1 - num2 <0.0001) && (num2 - num1 < 0.0001))
        return true;
    else
        return false;
}

猜你喜欢

转载自blog.csdn.net/qq_34793133/article/details/81018849