剑指offer——树的子结构(26题)

题目:输入两棵二叉树A和B,判断B是不是A的子结构。

老生常谈,有关二叉树的题型解答,离不开遍历算法,此题又可以看成是用中序遍历改进法来解答。

其思路如下:

i、先从A树的根节点开始,一一与B树的节点对应匹配比较;

ii、如i不成功,则遍历根的左儿子,重复i过程;

iii、如ii不成功,则遍历根的右儿子,重复i过程。

代码实现如下:

#include<iostream>
#include<cmath>

using namespace std;

struct TreeNode {
	double val;
	TreeNode* left, *right;
	TreeNode(double x):val(x),left(nullptr),right(nullptr){}
};

bool equal(TreeNode* root1, TreeNode* root2) {
	if (fabs(root1->val - root2->val) < 0.000001)
		return true;
	return false;
}

bool doesTree1HaveTree2(TreeNode* root1, TreeNode* root2) {
	if (root2 == nullptr)//能到达B树的叶子节点的子节点,则返回true
		return true;
	if (root1 == nullptr)//能到达A树的叶子节点的子节点,说明还不能匹配成功,返回false
		return false;
	if (!equal(root1, root2))//两节点值不相等,也返回false
		return false;

	return doesTree1HaveTree2(root1->left, root2->left) && doesTree1HaveTree2(root1->right, root2->right);
}

bool hasSubtree(TreeNode* root1, TreeNode* root2) {
	if (!root1 || !root2)
		return false;
	int result = false;
	if (equal(root1, root2))//从根节点判断,是否与root2匹配
		result = doesTree1HaveTree2(root1, root2);
	if (!result)//在根节点开始,与root2匹配不成功下,递归判断左儿子与root2是否匹配
		result = hasSubtree(root1->left, root2);
	if (!result)//在根节点且根的左子树,与root2匹配不成功下,递归判断右儿子与root2是否匹配
		result = hasSubtree(root1->right, root2);
	return result;
}

猜你喜欢

转载自blog.csdn.net/TT_love9527/article/details/82626841