题解 | #树的子结构#

树的子结构

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过程

全部评论

相关推荐

菜鸡29号:根据已有信息能初步得出以下几点: 1、硕士排了大本和大专 2、要求会多语言要么是招人很挑剔要么就是干的活杂 3、给出校招薪资范围过于巨大,说明里面的薪资制度(包括涨薪)可能有大坑
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务