【剑指offer】面试题26. 树的子结构

2020.7.8更新

class Solution {
public:
    //遍历判断结点是否相等
    bool isSubStructure(TreeNode* A, TreeNode* B) {
        bool res = false;
        if (A == nullptr || B == nullptr) return false;
        if (A->val == B->val) {//相等,则判断其子结构是否相等
            res = DoesTree1HavaTree2(A, B);
        }
        if(!res) res = isSubStructure(A->left, B);//左找
        if(!res) res = isSubStructure(A->right, B);//右找
        return res;
    }
    //判断子结构
    bool DoesTree1HavaTree2(TreeNode* A, TreeNode* B) {
        if (B == nullptr) return true;//树B的子树结构为空,则说明含有
        if (A == nullptr) return false;//树A的子树结构为空,而B不为空,则说明一定含有
        if (A->val != B->val) return false;//值不等,则为false
        return DoesTree1HavaTree2(A->left, B->left) && DoesTree1HavaTree2(A->right, B->right);//对A和B的子树继续判断
    }
};

解题思路

在树A中查找与B树根节点值一样的节点R。如果找到了值相同的节点,则判断树A中以R为根节点的子树是不是和树B具有共同的结构DoseTreeHave()
- 判断左右子结构是否相同,也可采用递归方式,递归结束条件分为四种情形
a. B树遍历完了(说明A树子结构和B树子结构相同),return true;
b. A树遍历完了(此时A树没有遍历完),说明不同,return false;
c. A树和B树比较的节点的值不同,return false;
d. A树和B树当前节点值相等,继续比较其左右子树
- 如果没找到值相同的节点,则将A树的左子树的首节点值和B树比较
- 如果左子树中不存在和B树节点值相同的节点,则向其右子树进行查找
- 如果均没有,则result=false,返回result

代码

class Solution {
public:
	//判断子结构是否相同
	bool isSubStructure(TreeNode* A, TreeNode* B) {
		bool result = false;
		if (A!=nullptr&&B!=nullptr)//A,B都不为空
		{
			if (A->val==B->val)//如果两个值相等,则判断其子树是否相等
			{
				result = DoseTreeHaveTree2(A, B);
			}
			//如果A树的值不和B树值相等,则将其左子树和B树比较
			if (!result)
			{
				result = isSubStructure(A->left, B);
			}
			//如果A树的左子树结构和B树不相等,则将其右子树和子树进行判断是否相等
			if (!result)
			{
				result = isSubStructure(A->right, B);
			}
		}
		return result;
	}
	//判断树的左右结构是否相同
	bool DoseTreeHaveTree2(TreeNode* A, TreeNode* B)
	{
		if (B == nullptr) return true;//如果B为null,说明结构相同
		if (A == nullptr) return false;//如果A为null,则说明子结构不同
		if (A->val != B->val) return false;//如果两个值不同,则说明子结构不同
		return DoseTreeHaveTree2(A->left, B->left) && DoseTreeHaveTree2(A->right, B->right);//如果A和B值相同,则分别判断其左右子树是否相同
	}
	
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值