树的子结构

 https://www.nowcoder.com/practice/6e196c44c7004d15b1610b9afca8bd88?tpId=13&tqId=11170&tPage=1&rp=1&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking

思路:

 先找到和B树的根节点的值相同的节点。然后再判断A左子树和右子树和B树的左右子树是否相同


class Solution {
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
		if(pRoot1 == nullptr || pRoot2 == nullptr)
			return false;
		bool res = false;
		if(checkEqual(pRoot1->val, pRoot2->val) )//找到A树中和B树根节点相同的节点
			res = check(pRoot1, pRoot2);//判断剩余的子树是否相同
		if(!res)//如果当前节点不是B树的根节点,就找左子树
			res = HasSubtree(pRoot1->left, pRoot2);
		if(!res)//同上,找右子树
			res = HasSubtree(pRoot1->right, pRoot2);
		return res;

    }
    
    
    //检查以proot1,proot2为根节点的树的结构是否相同
	bool check(TreeNode* pRoot1, TreeNode* pRoot2)
	{
		bool res ;
		if(pRoot2 == nullptr)
			return true;
		if(pRoot1 == nullptr)
			return false;
		if(!checkEqual(pRoot1->val, pRoot2->val))
			return false;
		res = check(pRoot1->left, pRoot2->left) && 
			check(pRoot1->right, pRoot2->right);
		return res;
	}

	bool checkEqual(double num1, double num2)
	{
		if(num1 - num2 >-1e-6 && num1 - num2 < 1e-6)
			return true;
		else
			return false;
	}

};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值