fn is_same_tree(node1: &Node, node2: &Node) -> bool {
if node1.value != node2.value {
return false;
}
if node1.children.len() != node2.children.len() {
return false;
}
for i in 0..node1.children.len() {
if!is_same_tree(&*node1.children[i], &*node2.children[i]) {
return false;
}
}
true
}
优化引用比较以提高效率
- 早期退出:
- 尽早比较节点的值和子节点的数量。如果节点值不同或者子节点数量不同,就可以直接返回
false
,避免对子节点进行不必要的递归比较。在上述代码中,一开始就对node1.value
和node2.value
,以及node1.children.len()
和node2.children.len()
进行比较。
- 并行比较:
- 在多核系统中,可以考虑并行比较子节点。例如,使用
rayon
库来并行处理子节点的比较。不过这需要引入外部依赖,并且要小心处理共享引用的问题。
- 减少间接引用:
- 在比较子节点时,通过
&*
操作减少一次间接引用,因为children
是Vec<Box<Node>>
,Box
本身是一个智能指针,直接用&
取引用会有额外的间接层次。在is_same_tree(&*node1.children[i], &*node2.children[i])
中,通过&*
操作直接获取Node
的引用,减少了间接引用开销。