当前位置: 首页 > 知识库问答 >
问题:

将重复节点从二叉树映射到哈希映射

卫俊力
2023-03-14

我正在尝试创建一个函数,该函数通过二叉树搜索重复节点并将每个唯一节点在树中出现的次数存储到哈希图中。

这是一个更具体的问题-

“创建一个名为YourBinaryTree的公共类,该类扩展BinaryTree。重写受保护的映射。”

我尝试递归地搜索树,但似乎无法使其工作,因为重复节点正在创建新映射,而不是替换旧映射的值。

以下是我迄今为止编写的代码:

import java.util.Map;
import java.util.HashMap;

public class YourBinaryTree extends BinaryTree
{

protected Map<Object, Integer> valueCount()
{
    Map<Object, Integer> treeMap = new HashMap<>();
    
    if(root == null)
    {
        return treeMap;
    }
    
    if(root.left == null && root.right == null)
    {
        treeMap.put(root.value , 1);
        return treeMap;
    }
    
    return valueCount(root);
}

private Map<Object, Integer> valueCount(Node current)
{
    Map<Object, Integer> treeMap = new HashMap<>();
    
    if(current == null)
    {
        return treeMap;
    }
    
    if(treeMap.containsKey(current.value))
    {
        treeMap.put(current.value, treeMap.get(current) + 1);
    }
    else
    {
        treeMap.put(current.value, 1);
    }
    /*
    Map<Object, Integer> treeMapLeft = new HashMap<>();
    Map<Object, Integer> treeMapRight = new HashMap<>();
    
    treeMapLeft.putAll(valueCount(current.left));
    treeMapRight.putAll(valueCount(current.right));
    
    treeMapRight.forEach(
            (key, value)
            -> treeMapLeft.merge(key, value, (v1, v2) -> v1+v2));
        
    
    treeMap = treeMapLeft;
    */
    treeMap.putAll(valueCount(current.left));
    treeMap.putAll(valueCount(current.right));
    
    return treeMap;
}

}

以下是创建二叉树的类的代码:

public class BinaryTree
{
    protected class Node
    {
        protected Object value;
        protected Node left;
        protected Node right;
    
        Node(Object setValue)
        {
            value = setValue;
        }
    }
    protected Node root;
}

我尝试过使用merge函数,但我真的很确定如何实现它。任何帮助都将不胜感激,谢谢!:)

共有2个答案

皮安顺
2023-03-14

如果要在valueCount方法中创建一个新映射,该映射为空,则需要在每次调用valueCount方法时传递在重写方法中创建的映射对象以进行更新。所以你的方法是这样的:

private void valueCount(Node current,HashMap<Object,Integer> treeMap){
     //rest of your code
}
公孙宏远
2023-03-14

我们只需要做一个简单的递归树遍历

import java.util.Map;
import java.util.HashMap;

public class YourBinaryTree extends BinaryTree {
    private void traverse_tree(Node root, Map<Object, Integer> objectCountMap) {
        if(root == null) {
            return;
        }
        objectCountMap.putIfAbsent(root, 0);
        objectCountMap.put(root, objectCountMap.get(root) + 1);
        traverse_tree(root.left, objectCountMap);
        traverse_tree(root.right, objectCountMap);
    }

    public Map<Object, Integer> valueCount()
    {
        Map<Object, Integer> objectCountMap = new HashMap<>();
        traverse_tree(root, objectCountMap);
        return objectCountMap;
    }
}

注意ectivtCountMap的key的类应该正确实现equals()hashcode()方法。

根据Object类的equals()hashcode(),只有当两个对象的内存地址相等时,它们才是相等的
例如:

Object obj1 = new Object();
Object obj2 = new Object();
Map<Object, Integer> countMap = new HashMap<>();
countMap.put(obj1, 1);
countMap.put(obj2, 2);
countMap.get(obj1); // Returns 1
countMap.get(obj2); // Returns 2 

-----------

Object obj1 = new Object();
Object obj2 = obj1 // obj2 has same memory address as obj1
Map<Object, Integer> countMap = new HashMap<>();
countMap.put(obj1, 1);
countMap.put(obj2, 2);
countMap.get(obj1); // Returns 2
countMap.get(obj2); // Returns 2 

 类似资料:
  • 我想获取一个Javascript对象并将其转换为哈希数组。 以下操作仅获取对象的一个元素并将其转换为数组: 返回: 但是,当我试图创建散列元素来组成数组时,出现了一个错误: 返回: 我做错了什么?

  • 尝试以以下方式创建(或者更确切地说学习)一个: 我正在使用一个在线编译器,并且已经搜索了很多,我发现我的声明方式是正确的,但是出现了其他错误 下面是错误 我需要帮助的是:我只是想了解创建hashmap并在其中插入一些键和值的基本知识,但是上面的错误在第一步就阻止了我……非常感谢对解决此问题的任何帮助!!:)

  • 我可以有一个哈希图在Java看起来像这样吗? 我的问题和这里的类似问题 我是Java新手。所以我想知道的是,如果我需要上面这样的东西,如果它无效,什么是最好的数据结构?

  • 我正试图让我的头脑围绕着一个哈姆特的细节。我会用Java自己实现一个,只是为了理解。我熟悉尝试,我想我得到了HAMT的主要概念。 基本上, 两种类型的节点: null null 我不太明白的部分是碰撞检测和缓解。在链接的论文中,他暗示了这一点: 然后将现有键插入到新的子哈希表中,并添加新键。每使用5个以上的散列比特,冲突的概率就减少1/32倍。偶尔,可能会消耗整个32位哈希,必须计算一个新的哈希来

  • > 阅读算法书,需要掌握哈希表的概念。他们写了关于使用单独链接的散列和使用线性探测的散列。我猜Java的HashMap是一个哈希表,因此我想知道HashMaps使用什么机制(链接或探测)? 我需要实现最简单的HashMap与get,put,删除。你能给我指出好的材料来阅读吗? 当用于映射的惟一键是自定义对象时,我们需要在相应的类型中实现hashCode()函数。我做得对吗?或者什么时候需要hash

  • 我有hashmap: 的列表: ,每个地图最多 100 个键。我知道如何以常规方式做到这一点。(在条目集上,每 100 个项目创建新地图)。有没有选择使用 java 8 lambda 或其他东西来做到这一点?(类似于 .)?