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
相关产品推荐
相关产品推荐

