判断两棵二叉树是否相似

二叉树T1和T2相似,指的是T1和T2都是空的二叉树或者都只有一个根结点;或T1的左子树和T2的左子树

是相似的并且T1的右子树和T2的右子树是相似的。


分析:采用递归的思想求解。若T1和T2都是空树,则相似;若有一个为空另一个不为空,则不相似;否则

递归地比较他们的左、右子树是否相似。


算法实现如下:

	public boolean similar(TreeNode t1, TreeNode t2)
	{
		// 采用递归算法判断两个二叉树是否相似
		boolean leftS = false, rightS = false;
		if (t1 == null && t2 == null) // 两树皆空
			return true;
		else if (t1 == null || t2 == null) // 只有一个树为空
			return false;
		else // 递归地进行判断
		{ 
			leftS = similar(t1.left, t2.left);
			rightS = similar(t1.right, t2.right);
			return leftS && rightS;
		}
	}


  • 11
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 设计试验: 1. 构造两棵二叉树,其中一棵为空树,另一棵只有一个根节点。 2. 构造两棵二叉树,其中一棵只有一个根节点,另一棵有两个节点,其中一个节点为根节点,另一个节点为左子节点。 3. 构造两棵二叉树,其中一棵只有一个根节点,另一棵有两个节点,其中一个节点为根节点,另一个节点为右子节点。 4. 构造两棵二叉树,其中一棵只有一个根节点,另一棵有三个节点,其中一个节点为根节点,另外两个节点为左右子节点。 5. 构造两棵二叉树,其中一棵有三个节点,另一棵有四个节点,两棵树的结构相同,但节点的值不同。 算法设计: 1. 如果两棵二叉树都为空,返回true。 2. 如果两棵二叉树中有一棵为空,返回false。 3. 如果两棵二叉树的根节点的值不相等,返回false。 4. 递归判断两棵二叉树的左子树是否相似,如果不相似,返回false。 5. 递归判断两棵二叉树的右子树是否相似,如果不相似,返回false。 6. 如果以上条件都满足,返回true。 代码实现: bool isSimilar(TreeNode* root1, TreeNode* root2) { if (root1 == NULL && root2 == NULL) { return true; } if (root1 == NULL || root2 == NULL) { return false; } if (root1->val != root2->val) { return false; } if (!isSimilar(root1->left, root2->left)) { return false; } if (!isSimilar(root1->right, root2->right)) { return false; } return true; } ### 回答2: 首先,我们需要明确相似的定义。两棵二叉树若它们的结构相同,并且对应结点上的数据相同,则这两棵二叉树相似。结构相同是指它们的形状相同、每个结点的子树个数也相同,包括为空的叶子结点,对应位置上为空的结点也必须相同。 接着,我们设计算法。由于相似的定义涉及到结构和数据的比较,一个比较自然的想法是采用递归算法。具体来说,我们可以设计一个递归函数 similar(tree1, tree2), 用于判断两棵以 tree1 和 tree2 为根节点的二叉树是否相似。它的返回值应该是布尔型,即相似或不相似。 对于 similar(tree1, tree2), 我们需要进行以下分类讨论: - 当 tree1 和 tree2 都为空时,它们相似,返回 true。 - 当 tree1 和 tree2 中,只有一个为空时,它们不相似,返回 false。 - 当 tree1 和 tree2 都不为空,且它们根节点的数据相同,则继续递归它们的左右子树。如果它们的左右子树都相似,则返回 true,否则返回 false。 在代码实现上,我们可以写出下面的程序: ``` bool similar(TreeNode* tree1, TreeNode* tree2) { if (tree1 == NULL && tree2 == NULL) { return true; } else if (tree1 == NULL || tree2 == NULL) { return false; } else if (tree1->val == tree2->val) { return similar(tree1->left, tree2->left) && similar(tree1->right, tree2->right); } else { return false; } } ``` 在这个程序中,我们首先通过判断空结点的情况确定了相似或不相似。对于非空结点,我们进行了数据的比较,并继续递归它们的左右子树进行比较。 最后是测试。我们可以设计多个不同的测试用例,覆盖各种情况。例如: - 两棵空树相似; - 一棵空树和一棵非空树不相似; - 两棵形状相同、数据也相同的二叉树相似; - 两棵形状相同、数据不相同的二叉树相似; - 两棵形状不同、数据相同的二叉树相似; - 两棵形状不同、数据也不相同的二叉树相似。 通过上述测试,我们可以判断我们的算法实现是否正确。 ### 回答3: 首先,我们可以设计出一种递归的方法来解决这个问题。我们可以将两棵二叉树分别看作根节点和左右子树,然后对左右子树进行递归判断。具体步骤如下: 1. 首先判断两棵树是否都为空,如果都为空,返回 True。 2. 如果有一棵树为空,另一棵树非空,返回 False。 3. 如果两棵树都有根节点,但根节点的值不同,返回 False。 4. 如果两棵树都有根节点,且根节点的值相同,对左右子树进行递归判断。 具体代码如下: ``` class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def isSimilar(tree1, tree2): if not tree1 and not tree2: return True if not tree1 or not tree2: return False if tree1.val != tree2.val: return False left_similar = isSimilar(tree1.left, tree2.left) right_similar = isSimilar(tree1.right, tree2.right) return left_similar and right_similar # 测试 tree1 = TreeNode(1, TreeNode(2), TreeNode(3)) tree2 = TreeNode(1, TreeNode(3), TreeNode(2)) print(isSimilar(tree1, tree2)) # True tree3 = TreeNode(1, TreeNode(2), TreeNode(3)) tree4 = TreeNode(1, TreeNode(4), TreeNode(5)) print(isSimilar(tree3, tree4)) # False ``` 我们可以对上面的代码进行测试,可以发现第一个测试用例得到的结果是 True,说明两棵树是相似的;而第二个测试用例得到的结果是 False,说明两棵树不相似。 在实际应用中,我们可以把树的结构转成列表或字符串来进行比较,也可以使用其他相关的数据结构来实现。总的来说,这个问题的解法应该都是类似的,只需要判断两棵树的结构和节点的值是否相似即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值