You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust为何可直接使用==判断两棵二叉树是否相等?

Rust 支持直接用==判断二叉树相等的实现原理
  • 最基础的前提是题目给出的TreeNode定义上添加了#[derive(PartialEq, Eq)]派生宏,这个宏会自动为结构体生成逐字段比对的相等判断逻辑,不需要开发者手写遍历代码。
  • 这个自动生成的判断逻辑会递归复用所有字段类型自身的Eq实现,逐层完成深度比较,和手写DFS的逻辑完全一致:
    • 首先比对val字段:i32是基础数值类型,标准库已经实现了Eq,直接判断值是否相等即可。
    • 接着比对left、right两个子节点字段,两个字段的类型是Option<Rc<RefCell<TreeNode>>>,嵌套的每一层类型都预置了合法的Eq实现:
      • 对于Option<T>,只要内部类型T实现了Eq,Option就自动具备相等判断能力:两边都是None判定为相等,一边是None一边是Some(_)直接判定不等,都是Some则继续比对内部包裹的值。
      • 对于Rc<T>,默认的==判断不是比较指针地址(Rc::ptr_eq才是判断是否指向同一块内存的方法),只要两个Rc包裹的内部值相等,哪怕是两次独立分配的实例,也会判定为相等,比对时会自动解引用拿到内部值继续判断。
      • 对于RefCell<T>,Eq实现会在运行时自动借用内部存储的值(比较场景下不存在活跃的可变借用,不会触发panic),继续对内部值做相等判断。
  • 整个链路递归下来,就会自动完成从根节点到叶子节点的全量结构、值比对,和手写深度优先搜索的判断效果完全一致,所以可以直接用p == q作为题解。

关键误区提醒:很多人第一次看到这个解法会误以为Rust是在比较指针地址,实际上Rc的默认相等判断是值语义,这是这个一行解法能够成立的核心细节。

核心实现代码如下:

// 引入依赖
use std::rc::Rc;
use std::cell::RefCell;

impl Solution {
    pub fn is_same_tree(p: Option<Rc<RefCell<TreeNode>>>,
                        q: Option<Rc<RefCell<TreeNode>>>) -> bool {
        p == q
    }
}

内容的提问来源于stack exchange,提问作者AsukaMinato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 05:55:05