26 剑指offer:树的子结构(注意思考递归结束条件是什么。)

本文介绍了一种算法,用于判断一棵二叉树B是否为另一棵二叉树A的子结构。通过递归方法实现了两个核心函数:一是判断B是否为A的子结构;二是判断两棵树是否完全相同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

思路:第一步,首先找到A中与B根结点相等的结点node。

第二部,判断以node为根结点的子树与B是否相等。

代码:

class Solution {

public:
   // 判断pRoot2是否是pRoot1的子结构(两个树根结点不一定相同,需要先判断根结点)
   bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        if(pRoot1==NULL||pRoot2==NULL)
            return false;//
         
        bool res=false;
         
        if(pRoot1->val==pRoot2->val)
            res= DoesTree1HaveTree2(pRoot1,pRoot2);
        if(!res)//如果当前结点不等,则判断其左子树
            res= HasSubtree(pRoot1->left,pRoot2);
        if(!res)//左子树不等判断其右子树
            res=HasSubtree(pRoot1->right,pRoot2);
        return res;
    }
     //判断root2是否是root1的子结构(两个树根结点相同)
    bool DoesTree1HaveTree2(TreeNode* root1,TreeNode* root2)
    {   if(root2==NULL)//这句必须在if(root1==NULL)的前面,不然会出错
            return true;
        if(root1==NULL)
            return false;
        
        if(root1->val!=root2->val)
            return false;
         
        return DoesTree1HaveTree2(root1->left,root2->left)&&DoesTree1HaveTree2(root1->right,root2->right);
    }
};

总结:递归的方法,如何正确的递归,参照以上两个函数。思考递归结束条件是什么。

延伸:如何判断两个树结构是否相等。可以利用判断一颗二叉树是否对称中调用的函数。即下面的函数。

与 //判断root2是否是root1的子结构(两个树根结点相同)

中不同的是,不能用

 if(root2==NULL)
            return true;
        if(root1==NULL)
            return false;
        

作为递归终止条件。

应该用:

if (root1 == NULL&&root2 == NULL)
		return true;
	if (root1 == NULL||root2 == NULL)
		return false;

代码:

//判断树root2与树root1是否相等 
bool DoesTree1HaveTree2(TreeNode* root1, TreeNode* root2)
{
	if (root1 == NULL&&root2 == NULL)
		return true;
	if (root1 == NULL||root2==NULL)
		return false;
	if (root1->val != root2->val)
		return false;
	return DoesTree1HaveTree2(root1->left, root2->left) && DoesTree1HaveTree2(root1->right, root2->right);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值