python中tree 100 6_LeetCode 100.相同的树 python/scala

这篇博客介绍了如何解决LeetCode第100题,即判断两棵二叉树是否在结构和节点值上完全相同。通过分析问题并提供三种不同的Python实现(包括深度优先搜索的递归和迭代方法)以及一个Scala实现,展示了如何检查二叉树的结构和节点值。
摘要由CSDN通过智能技术生成

Same Tree

环境:python 3.6,scala 2.11.8

题意

判断两颗二叉树是否相同(结构相同 + 各节点值相同)。

分析

首先,题意非常明确:当两颗树结构相同、各节点值相同时,则称这两棵树相同。因此,用集合装载节点值、判断集合中元素值是否相同无法通过,它无法判断结构是否相同。

基础:掌握树的先序、中序、后序三种遍历方式(DFS/BFS 方法);

选定上述一种遍历方式后,可在遍历过程中判断:

两颗树只有其中一颗树有子节点,则说明两树不同;

两个树都有子节点:

节点值不同,则说明两树不同;

节点值相同,继续遍历;

代码

python

def isSameTree(p, q):

"""

:type p: TreeNode

:type q: TreeNode

:rtype: bool

"""

def dfs(node1, node2):

if not node1 and not node2: return True

if not node1 or not node2: return False

return node1.val == node2.val and dfs(node1.left, node2.left) and dfs(node1.right, node2.right)

return dfs(p, q)

def isSameTreeV2(p, q):

if not p and not q: return True

if not p or not q: return False

return p.val == q.val and isSameTreeV2(p.left, q.left) and isSameTreeV2(p.right, q.right)

def isSameTreeV3(p, q):

if not p and not q: return True

if not p or not q: return False

s1, s2 = [p], [q]

while s1 and s2:

node1, node2 = s1.pop(), s2.pop()

if node1 and node2:

if node1.val != node2.val:

return False

s1.append(node1.right)

s1.append(node1.left)

s2.append(node2.right)

s2.append(node2.left)

elif node1 or node2:

return False

return True

scala

import scala.collection.mutable.Stack

object LC100 {

def isSameTree(p: TreeNode, q: TreeNode): Boolean =

(p, q) match {

case (null , null) => true

case (_, null) | (null, _) => false

case _ => p.value == q.value & isSameTree(p.left, q.left) & isSameTree(p.right, q.right)

}

def isSameTreeV2(p: TreeNode, q: TreeNode): Boolean = {

if (p == null & q == null) return true

if (p == null | q == null) return false

val (s1, s2) = (Stack(p), Stack(q))

while (s1.nonEmpty & s2.nonEmpty) {

val (node1, node2) = (s1.pop(), s2.pop())

if (node1 != null & node2 != null) {

if (node1.value != node2.value) return false

s1.push(node1.right)

s1.push(node1.left)

s2.push(node2.right)

s2.push(node2.left)

} else if (node1 != null | node2 != null )

return false

}

true

}

}

最后

欢迎交流和补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值