若已知两棵二叉树B1和B2皆为空,或者,皆不空且B1的左右子树和B2的左右子树分别相似,则称二叉树B1和B2相似。试编写算法判别给定两棵二叉树是否相似。
时间: 2023-09-06 08:03:56 浏览: 117
### 回答1:
可以使用递归的方法来判断两棵二叉树是否相似。具体思路如下:
1. 如果两棵二叉树都为空,则它们相似,返回 true。
2. 如果其中一棵二叉树为空,另一棵不为空,则它们不相似,返回 false。
3. 如果两棵二叉树的根节点的值不相等,则它们不相似,返回 false。
4. 递归判断两棵二叉树的左子树和右子树是否相似,如果都相似,则它们相似,返回 true,否则返回 false。
下面是具体的实现代码:
```python
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
# 递归判断两棵二叉树的左子树和右子树是否相似
return isSimilar(tree1.left, tree2.left) and isSimilar(tree1.right, tree2.right)
```
该算法的时间复杂度为 $O(n)$,其中 $n$ 是二叉树的节点数,因为需要遍历两棵二叉树的所有节点。空间复杂度为 $O(h)$,其中 $h$ 是二叉树的高度,因为使用递归栈空间来存储递归调用的信息。
### 回答2:
算法如下:
1. 若两棵二叉树均为空,则返回True。
2. 若两棵二叉树中有一棵为空,而另一棵不为空,则返回False。
3. 若两棵二叉树都不为空,则判断B1和B2对应节点的值是否相等:
a. 若不相等,则返回False。
b. 若相等,则分别对比B1的左右子树和B2的左右子树是否相似:
i. 若B1的左子树和B2的左子树相似,且B1的右子树和B2的右子树相似,则返回True。
ii. 若B1的左子树和B2的右子树相似,且B1的右子树和B2的左子树相似,则返回True。
iii. 若以上两种情况都不满足,则返回False。
下面是该算法的Python代码实现:
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def isSimilar(B1, B2):
if B1 is None and B2 is None:
return True
elif B1 is None or B2 is None:
return False
else:
if B1.val != B2.val:
return False
else:
return (isSimilar(B1.left, B2.left) and isSimilar(B1.right, B2.right)) or (isSimilar(B1.left, B2.right) and isSimilar(B1.right, B2.left))
# 测试样例
B1 = TreeNode(1)
B1.left = TreeNode(2)
B1.right = TreeNode(3)
B1.left.left = TreeNode(4)
B1.left.right = TreeNode(5)
B1.right.left = TreeNode(6)
B2 = TreeNode(1)
B2.left = TreeNode(3)
B2.right = TreeNode(2)
B2.left.left = TreeNode(6)
B2.right.left = TreeNode(5)
B2.right.right = TreeNode(4)
print(isSimilar(B1, B2)) # 输出True
### 回答3:
算法如下:
1. 编写一个函数`isSimilar`,该函数接受两个参数`B1`和`B2`,分别表示两棵二叉树。
2. 首先检查B1和B2是否都为空,如果是,则返回True,表示它们相似。
3. 然后检查B1和B2是否都不为空,如果是,则分别获取它们的左右子树B1_left, B1_right, B2_left, B2_right。
4. 利用递归调用`isSimilar(B1_left, B2_left)`判断B1_left和B2_left是否相似,如果不相似则返回False,否则继续。
5. 利用递归调用`isSimilar(B1_right, B2_right)`判断B1_right和B2_right是否相似,如果不相似则返回False,否则说明B1和B2相似。
完整的算法代码如下:
```
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def isSimilar(B1, B2):
if B1 is None and B2 is None:
return True
elif B1 is not None and B2 is not None:
B1_left = B1.left
B1_right = B1.right
B2_left = B2.left
B2_right = B2.right
return isSimilar(B1_left, B2_left) and isSimilar(B1_right, B2_right)
else:
return False
```
这个算法的时间复杂度是O(n),其中n是二叉树中节点的个数。
阅读全文