【面试题】剑指Offer-18-判断一颗树是否为另一颗树的子树

题目概述


解题思路

这里用到递归的思想

先递归【HasSubTree】找到和子树相同值的节点

然后再用另一个递归函数【DoseTree1HasTree2】判断是否相等

如果遍历到SubT子树的叶子结点,则匹配成功

如果SrcT为空,则匹配没有成功

如果都存在,则判断左子树和右子树

根据左子树和右子树的返回结果判断此时是否完全匹配

如果不匹配,则继续【HasSubTree】找值相同的节点

代码实现

bool DoesTree1HasTree2(const TreeNode* srcT, const TreeNode* subT)
{
	//如果子树到了叶子节点,表示成功
	if (subT == NULL)
		return true;

	//表示没有匹配成功
	if (srcT == NULL)
		return false;

	bool retLeft = DoesTree1HasTree2(srcT->_left, subT->_left);
	bool retRight = DoesTree1HasTree2(srcT->_right, subT->_right);

	return retLeft && retRight;
}

bool HasSubTree(const TreeNode* srcT, const TreeNode* subT)
{
	if (subT == NULL)
		return false;

	bool ret = false;
	if (srcT != NULL)
	{
		if (srcT->_data == subT->_data)
		{
			ret = DoesTree1HasTree2(srcT, subT);
		}

		if (!ret)
			ret = HasSubTree(srcT->_left, subT);

		if (!ret)
			ret = HasSubTree(srcT->_right, subT);
	}
	return ret;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值