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

泛型N叉树中equals方法的实现疑问

解决N叉树equals方法的递归子节点比较问题

嘿,我来帮你搞定这个N叉树的相等性判断问题!你现在的sameTree方法只检查了数据和节点数量,但确实漏掉了递归遍历子节点数组的关键步骤。下面是一步步的解决方案:

首先要修正的几个关键点

  • 不要用==比较data:对于泛型类型T,==是比较对象引用,而我们需要的是内容相等,所以应该用Objects.equals(this.data, xpto.data)(记得导入java.util.Objects),这样还能处理data为null的情况。
  • 子节点数组的比较要分情况:首先判断两个数组的长度是否一致,然后逐个递归比较每个位置的子节点;还要处理其中一个数组为null的边界情况。

修改后的sameTree和equals方法代码

import java.util.Objects;
import java.util.Arrays;

public class ArrayNTree<T extends Comparable<T>> implements NTree<T>, Cloneable {
    /* Data of the tree*/
    private T data;
    /* Primary array to store the children */
    private ArrayNTree<T>[] children;
    private int size; // 假设你的size是已正确维护的节点总数

    @Override
    public boolean equals(Object other) {
        if (this == other) return true;
        if (other == null || getClass() != other.getClass()) return false;
        ArrayNTree<?> otherTree = (ArrayNTree<?>) other;
        // 已通过类型检查,执行unchecked cast
        return sameTree((ArrayNTree<T>) otherTree);
    }

    private boolean sameTree(ArrayNTree<T> xpto) {
        // 1. 比较当前节点的数据
        if (!Objects.equals(this.data, xpto.data)) {
            return false;
        }
        // 2. 处理子节点数组的null情况与长度校验
        if (this.children == null && xpto.children != null) {
            return false;
        }
        if (this.children != null && xpto.children == null) {
            return false;
        }
        if (this.children != null && xpto.children != null) {
            if (this.children.length != xpto.children.length) {
                return false;
            }
            // 3. 递归比较每个对应位置的子节点
            for (int i = 0; i < this.children.length; i++) {
                ArrayNTree<T> child1 = this.children[i];
                ArrayNTree<T> child2 = xpto.children[i];
                // 处理子节点为null的场景,直接用Objects.equals递归判断
                if (!Objects.equals(child1, child2)) {
                    return false;
                }
            }
        }
        // 4. 最后比较size(若size维护正确,此步可省略,子节点相等则size必然一致)
        return this.size == xpto.size;
    }

    // 按Java规范,重写equals必须同步重写hashCode
    @Override
    public int hashCode() {
        int result = Objects.hash(data, size);
        result = 31 * result + Arrays.hashCode(children);
        return result;
    }
}

代码解释

  1. 数据比较:用Objects.equals替代==,完美兼容data为null的场景,确保比较的是内容而非对象引用。
  2. 子节点数组校验:先处理其中一个数组为null的边界情况,再检查数组长度是否一致,最后遍历每个子节点递归判断相等性。
  3. size比较:如果你的size字段在增删子节点时能同步更新,这一步可以作为额外校验;若担心size可能出现不一致,保留它能提升判断准确性。
  4. hashCode重写:遵循Java规范,保证equals和hashCode的一致性,避免HashMap等集合类出现异常行为。

这样修改后,你的N叉树就能正确递归比较所有子节点,完成完整的相等性判断啦!

内容的提问来源于stack exchange,提问作者Filipe Nóbrega

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:42:06