Leecode第100题:相同的树 一、整体思路判断两棵树是否相同单靠一种遍历序列不够比如中序会丢失结构信息但中序 前序两个序列都相同通常就能唯一确定一棵二叉树前提是节点值有唯一性约定。代码就是对 p、q 分别求中序序列带None比较再对 p、q 分别求前序序列带None比较两次都相等才返回True。二、逐段解释same中序遍历带 Nonepythondef same(x, y): if y: same(x, y.left) x.append(y.val) same(x, y.right) else: x.append(None)节点非空递归左 → 记录val→ 递归右即中序左-根-右。节点为空append(None)。注意None只在遇到空孩子时记录不是给每个节点前后都补None。所以序列长度 节点数 空孩子数。same1前序遍历带 Nonepythondef same1(x, y): if y: x.append(y.val) same1(x, y.left) same1(x, y.right) else: x.append(None)节点非空先记录val→ 递归左 → 递归右即前序根-左-右。节点为空append(None)。主流程pythonnums1, nums2 [], [] same(nums1, p) # p 的中序 same(nums2, q) # q 的中序 if nums1 ! nums2: return False # 中序不同直接 False same1(nums1, p) # 注意往 nums1 里继续追加 p 的前序 same1(nums2, q) # 往 nums2 里追加 q 的前序 return nums1 nums2关键细节same1复用了nums1/nums2把前序追加到中序后面变成[中序p..., 前序p...]和[中序q..., 前序q...]最后整体比较。因为前半段中序前面已经比过相等后半段前序相等就等价于前序也相等。这个复用是可行的但可读性差容易误会。三、逻辑上对不对结论对两棵树是否相同这个判断这个方法是正确的而且比只用一个中序强得多。理由中序 前序都带None能唯一确定二叉树结构两棵树的这两个序列都相同 ⟺ 两棵树相同。即使不用唯一确定的定理带None的序列本身已经保留了完整结构信息两个序列都相同自然两棵树相同。不过要注意一个前提节点值可以重复也没关系因为None占位保留了结构序列比较是逐位置比较的重复值不会造成歧义。所以这个写法在值重复时也成立。四、代码层面的问题不影响正确性但建议改1. 复用nums1/nums2不清晰pythonsame1(nums1, p) # nums1 此时已有中序又追加前序虽然逻辑上成立前缀已比过但读者容易以为在比中序前序拼接串容易出错。建议用新列表pythonpre1, pre2 [], [] same1(pre1, p) same1(pre2, q) return pre1 pre22. 空树边界p None, q Nonesame都会append(None)nums1 nums2 [None]继续same1同样最终True。正确。p None, q 非空中序[None]vs[..., None, ...]长度/内容不同False。正确。3. 两次遍历其实一次就够带None的任意一种遍历前序/后序已经保留了完整结构信息单用前序带None就能判等pythondef ser(node, out): if node is None: out.append(None) return out.append(node.val) ser(node.left, out) ser(node.right, out) a, b [], [] ser(p, a); ser(q, b) return a b中序单独不行结构信息丢失但中序前序当然行只是多此一举。前序或后序单独带None就够了。4. 递归函数没有返回值靠副作用same/same1不return东西靠append副作用填充列表。能跑但风格上不如让函数返回列表或用显式return。不是错误。五、和之前isSymmetric的对比判相同isSameTree两棵树同侧对应p.left对q.leftp.right对q.right。用前序/后序带None比较即可或直接递归。判对称isSymmetric交叉对应a.left对b.right。序列化时右子树要按镜像顺序遍历才能直接比较。你这题是isSameTree同侧对应所以中序前序或单前序带None都成立。六、一句话总结这段代码用中序带None先筛一遍再用前序带None筛一遍两个序列都相同才判相同逻辑正确但复用列表可读性差而且其实单个带None的前序或后序序列就足够两次遍历是冗余的。建议改成一次前序序列化后直接比较更简洁清晰。