用 Python 编写程序检查是否可以通过交换节点来形成两棵树
假设我们有两棵树,我们必须检查是否可以通过交换任意节点的左子树和右子树任意次数将第一棵树转换为第二棵树。
因此,如果输入如下

则输出将为 True
为了解决这个问题,我们将遵循以下步骤 −
que1 := 最初为 root0 的队列
que2 := 最初为 root1 的队列最初
当 que1 和 que2 不为空时,执行
temp1 := 一个新列表,temp2 := 一个新列表
values1 := 一个新列表,values2 := 一个新列表
如果 que1 和 que2 包含不同数量的元素,则
返回 False
对于 i,范围为 0 到 que1 的大小 − 1,执行
在 values1 末尾插入 que1[i] 的值
在 values2 末尾插入 que2[i] 的值
如果 que1[i] 的右侧不为空,则
在 temp1 末尾插入 que1[i] 的右侧
如果 que1[i] 的左侧不为空,则
在 temp1 末尾插入 que1[i] 的左侧
如果 que2[i] 的右侧不为空,则
插入 que2[i] 的右侧在 temp2 的末尾
如果 que2[i] 的左侧不为空,则
在 temp2 的末尾插入 que2[i] 的左侧
如果 values1 与 values2 不同,则
如果 values1 与 values2 的反向顺序不同,则
返回 False
que1 := temp1, que2 := temp2
返回 True
让我们看看下面的实现以便更好地理解 −
示例
class TreeNode: def __init__(self, data, left = None, right = None): self.val = data self.left = left self.right = right class Solution: def solve(self, root0, root1): que1 = [root0] que2 = [root1] while que1 and que2: temp1 = [] temp2 = [] values1 = [] values2 = [] if len(que1) != len(que2): return False for i in range(len(que1)): values1.append(que1[i].val) values2.append(que2[i].val) if que1[i].right: temp1.append(que1[i].right) if que1[i].left: temp1.append(que1[i].left) if que2[i].right: temp2.append(que2[i].right) if que2[i].left: temp2.append(que2[i].left) if values1 != values2: if values1 != values2[::-1]: return False que1 = temp1 que2 = temp2 return True ob = Solution() root = TreeNode(2) root.right = TreeNode(4) root.right.left = TreeNode(3) root.right.right = TreeNode(5) root1 = TreeNode(2) root1.left = TreeNode(4) root1.left.left = TreeNode(3) root1.left.right = TreeNode(5) print(ob.solve(root, root1))
输入
root = TreeNode(2) root.right = TreeNode(4) root.right.left = TreeNode(3) root.right.right = TreeNode(5) root1 = TreeNode(2) root1.left = TreeNode(4) root1.left.left = TreeNode(3) root1.left.right = TreeNode(5)
输出
True
相关文章
有用资源
python 参考教程 - 该教程包含有关 python 的更多信息:https://www.cainiaomax.com/python/

