【问题标题】:Mapping duplicate nodes from binary tree to a hashmap将二叉树中的重复节点映射到哈希图
【发布时间】:2020-11-28 09:26:07
【问题描述】:

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

这是一个更具体的问题版本 -

“创建一个名为 YourBinaryTree 的公共类,它扩展 BinaryTree。覆盖受保护的 Map valueCount() 并让它返回一个 Map,将树中的每个对象映射到它出现的次数。如果树是空(root 为空)你应该返回一个空 Map。不要在你的类中声明任何字段“

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

这是我目前编写的代码:

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;
}

我尝试过使用合并功能,但我真的很确定如何实现它。任何帮助将不胜感激,谢谢! :)

【问题讨论】:

    标签: java hashmap binary-tree


    【解决方案1】:

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

    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;
        }
    }
    

    注意objectCountMap的key的类应该实现equals()hashcode()方法properly

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

    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 
    
    

    【讨论】:

      【解决方案2】:

      您正在您的 valueCount 方法中创建一个新地图,该地图为空,您需要在每次调用 value count 方法时传递在您的覆盖方法中创建的地图对象,以进行更新。所以你的方法看起来像这样:

      private void valueCount(Node current,HashMap<Object,Integer> treeMap){
           //rest of your code
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-24
        • 2017-01-05
        • 1970-01-01
        • 1970-01-01
        • 2017-10-09
        • 1970-01-01
        • 1970-01-01
        • 2018-12-04
        相关资源
        最近更新 更多