树的子结构

本文介绍了一种用于判断一棵树是否包含另一棵树作为其子树的算法。该算法通过递归方式比较两棵树的根节点值,并进一步比较左右子节点来确定结构一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路: 

1. 在树A中查找和根结点的值一样的结点.如果发现某一结点的值和树B的头结点的值相同,则进行第二步判断.

第二步:

2. 判断树A中以R为根结点的子树是不是和树B具有相同的结构.即如果结点R的值和树B的根节点不相同,则以R

为根节点的子树和树B肯定不是具有相同的结点;如果它们的值相同,则递归的判断它们各自的左右结点的值是不

是相同。

	public boolean HasSubtree(TreeNode root1, TreeNode root2)
	{
		boolean flag = false; // 设置标志位flag,默认为false
		if (root1 != null && root2 != null)
		{
			if (root1.val == root2.val) // 如果根结点的值相同,就继续判断
			{
				flag = DoesTree1HaveTree2(root1, root2);
			}
			// 比较树A左子树结点和树B根结点的值
			if (!flag)
				flag = HasSubtree(root1.left, root2);
			
			// 比较树A右子树结点和树B根结点的值
			if (!flag)
				flag = HasSubtree(root1.right, root2);
		}
		return flag;
	}

	private boolean DoesTree1HaveTree2(TreeNode root1, TreeNode root2)
	{
		// 树Ak到达叶节点,而树B没有到达时
		if (root1 == null && root2 != null)
			return false;
		// 树B到达叶节点时
		if (root2 == null)
			return true;
		// 树A中结点的值和树B中结点值不相等时
		if (root1.val != root2.val)
			return false;
		// 继续比较树A和树B的左子树和右子树的情况
		return DoesTree1HaveTree2(root1.left, root2.left) 
				&& DoesTree1HaveTree2(root1.right, root2.right); 
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值