题解 | #树的子结构#

树的子结构

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

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
public:
	/*
		双树判断,双迭代解决
		第一层迭代是否存在子树
		第二层迭代,子树中的特征判断
	*/
	bool judge(TreeNode* pRoot1, TreeNode* pRoot2)		// 第二层迭代
	{
		bool left = true, right = true;			// 一开始假设两者的左右子节点都是相等的
		if(!pRoot1 || pRoot1->val != pRoot2->val){	// 树结构的节点为空或者两者值不等,都是认为非子结构的
			// std::cout << pRoot1->val << " " << pRoot2->val << std::endl;
			return false;
		}
		// 以待判断的树左右节点为条件判断左右子节点与树的子节点关系
		if(pRoot2->left)	
			left = judge(pRoot1->left, pRoot2->left);
		if(pRoot2->right)
			right = judge(pRoot1->right, pRoot2->right);
		if(left&&right)
			return true;	// 两个子节点都是相等的话,那么认为是子结构
		else 
			return false;
	}


    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {	// 第一层迭代,判断是否在下一节点中开始子树判断
		if(!pRoot2||!pRoot1) return false;					// 待判断树为空不为任何树子结构;待判断树不空但树遍历到的节点为空是不行的
		if (judge(pRoot1, pRoot2)) return true;				// 判断两者的对应的位置值是否相同,相同则认为是子结构
		if(HasSubtree(pRoot1->left, pRoot2) || HasSubtree(pRoot1->right, pRoot2)) 	// 迭代下一个节点
			return true;
		else 
			return false;
    }
};

挤挤刷刷! 文章被收录于专栏

记录coding过程

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-03 18:22
投了几百份简历,专业和方向完全对口,都已读不回。尝试改了一下学校,果然有奇效。
steelhead:这不是很正常嘛,BOSS好的是即便是你学院本可能都会和聊几句,牛客上学院本机会很少了
点赞 评论 收藏
分享
榕城小榕树:1200单休,我去干点啥别的不好
点赞 评论 收藏
分享
认真搞学习:这么良心的老板真少见
点赞 评论 收藏
分享
半解316:内容充实,细节需要修改一下。 1,整体压缩为一页。所有内容顶格。 2,项目描述删除,直接写个人工作量 修改完之后还需要建议,可以私聊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务