ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 遍历树结构的算法遍历

2019-07-03 19:50:25  阅读:202  来源: 互联网

标签:java algorithm tree-traversal


Class Diagnostic {

//Get the size in bytes of an object
static long sizeOf(Object object);

//Get the references for an object (leafs)
static List<Object> getRefs(Object object);

//Implement this with those above
public Long objectSize(Object object);
}

如何实现objectSize以返回对象的字节大小?

方法objectSize返回组合的所有子节点(树上的每个节点)的字节大小.

例:

               Object A (19 bytes)
                      /    \
                     /      \
                   B(20)    C(37)
                   /
                  /
                C(15)

答案:19 20 37 15 = 91

我在面试时遇到了这个问题,我很好奇看到别人的答案.因为,我对树遍历算法知之甚少.

我想出了这个……(我知道这是不好的;),只是想学习)

    public Long objectSize(Object object) {
    List<Object> objectList = new ArrayList<Object>();

    Long sum = sizeOf(object);
    objectList = getRefs(object);

    for(Object object : objectList){
           sum += objectSize(object);
    }

return sum;
}

我注意到我可以有一个循环并运行stackoverflow错误,因为我没有检查我是否已经通过“节点”.然后我很难,我应该有另一个数据结构(如处理键/值的散列图)来处理临时列表以进行比较.

解决方法:

如果你正在处理一个真正的“树”结构,那么你不必担心周期.

你有基本的想法,但你需要考虑递归调用的实际返回值.如果我们假设对象的总大小(objectSize())等于其子项的大小加上它自己的大小(sizeOf()),那么您只需要确保将所有子树大小添加到一起.

这是你可以做到的一种方式:

public Long objectSize(Object object) {
    List<Object> objectList = getRefs(object);
    long sum = sizeOf(object);

    for(Object object : objectList) {
         sum += objectSize(object);
    }

    return Long.valueOf(sum);
}

您缺少的是递归的objectSize调用返回了一个值,并且该值需要包含(在这种情况下通过添加)到您的返回值中.

标签:java,algorithm,tree-traversal
来源: https://codeday.me/bug/20190703/1369839.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有