判断两棵二叉树是否相似

所谓两棵二叉树相似是指T1与T2都是空的二叉树或者都只有一个根结点,或T1的左子树和T2的左子树是相似的,且T1的右子树和T2的右子树是相似的,自然用到了递归的方法

上代码

/**
     * 用来判断两个二叉树是否相似(相似是指树的结构完全相同)
     * @param n1
     * @param n2
     * @return
     */
    public static boolean similar(Node n1,Node n2){
    	if((n1==null)&&(n2==null))
    		return true;
    	else{
    		if((n1==null)||(n2==null))
    			return false;
    		else
    			return similar(n1.left,n2.left)&&similar(n1.right,n2.right);
    	}
    }


### 回答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,说明两棵树不相似。 在实际应用中,我们可以把树的结构转成列表或字符串来进行比较,也可以使用其他相关的数据结构来实现。总的来说,这个问题的解法应该都是类似的,只需要判断两棵树的结构和节点的值是否相似即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值