题解 | #树的子结构#

树的子结构

https://www.nowcoder.com/practice/6e196c44c7004d15b1610b9afca8bd88

//这道题的思路,看到判断B是不是A的子结构,其实就是在比较B与A的某个子树是否一致。因此在局部上,这基本是个比较两棵二叉树是否相等的问题。用solve函数正常的递归解决就行。唯一需要注意的是可以允许A戛然而止,比如A后面还有更多的孙子节点,但只要到目前为止都与B相同就行了。因此需要在solve函数中处理B==nullptr的情况。
//而在宏观上,我们需要把A的子树一个个抓出来与B做比较。找到A的所有子树其实就是遍历A树的所有节点,因此在宏观上还要再写一个前序遍历来调用solve函数。
//完。
class Solution {
public:
	//可以将这个问题转化为求两棵树是否长得一样的问题。
	bool solve(TreeNode* A,TreeNode* B)
	{
		bool current=false;
		//因为毕竟求的是子树,是可以允许A有后续节点,B没有后续节点的情况的。
		if (B==nullptr) 
		{
			return true;
		}
		else if(A==nullptr && B!=nullptr)
		{
			//这种情况不被允许。
			return false;
		}
		else 
		{//A!=nullptr && B!=nullptr
			if (A->val==B->val) {
				current=true;//在都不为空的情况下,值相等便为要求。
			}else {
				current=false;
			}
		}
		//递归
		return current && solve(A->left, B->left) && solve(A->right, B->right);
	}

	bool FrontOrder(TreeNode* pRoot1, TreeNode* pRoot2)
	{
		if(pRoot1==nullptr)
			return false;
		if (solve(pRoot1,pRoot2)) 
		{//如果在当前节点出发能得到匹配的子树,就到此为止。
			return true;
		}
		//否则要继续遍历A树。看看A树上有没有与B树相同的子树。
		bool left=FrontOrder(pRoot1->left, pRoot2);
		if(left)return true;
		bool right=FrontOrder(pRoot1->right, pRoot2);
		return right;
	}

    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
		if (pRoot1==nullptr|| pRoot2==nullptr) {
			return false;
		}
		return FrontOrder(pRoot1, pRoot2);
    }
};

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务