【剑指offer】树的子结构

题目:输入两棵二叉树AB,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

分析:要做题,先要理解题目的意思。首先我们先理解什么是子结构,这里的子结构不是说B只有根节点和A的某一节点相连接,而是B中可能有2个以上的节点和A中节点相连接。还有一点,A中可能有多个节点值和B的根节点的值相同,所以可能要找出所有A中节点值和B根节点值相同的情况,直到判定BA的子结构时结束。我的方法是:

a.先遍历A的所有节点,且全部保存在数组里;

b.找到A中节点值和B的根节点值相同的节点;

c.遍历B中节点,判断与之对应的A节点值是否相同,相同则继续,否则返回false(递归)

d.c结果返回false,则继续cd步骤;

本文的方法可能有些笨拙,写出了是给各位奋斗中的小伙伴一个参考思路,共同努力!

程序:

//先序遍历二叉树;
inline void preorder(TreeNode* t, vector<TreeNode*> &temp){
	if (!t)  return;
	temp.push_back(t);
	if (t->left) preorder(t->left, temp);
	if (t->right) preorder(t->right, temp);
}

//t1节点值和t2节点值相同,判断t1是否包含t2;
inline bool isequal(TreeNode *t1, TreeNode * t2){
	if (t1->val != t2->val) return false;
	if (t2->left&&!t1->left)  return false;
	if (t2->right&&!t1->right) return false;
	if(t2->left&&t2->right)	return isequal(t1->left, t2->left)&&isequal(t1->right,t2->right);
	else if (t2->left) return isequal(t1->left, t2->left);
	else if (t2->right)  return isequal(t1->right, t2->right);
	else return true;
}

bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
	if (!pRoot1 || !pRoot2)  return false;   //空树不是任何树的子结构;
	vector<TreeNode*> t1;
	preorder(pRoot1, t1);   //遍历pRoot1二叉树,节点保存在t1容器中;
	int i = 0;
	while (i<t1.size()){
		if (pRoot2->val == t1[i]->val){
			if (isequal(t1[i], pRoot2)) return true;
		}
		i++;
	}
	return false;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值