该方法如何添加所有BST节点的大小?

时间:2016-09-22 03:07:22

标签: java recursion binary-search-tree

我不明白sum是如何递增的,因为每次调用该方法时它都会重置为1。我知道内存存储在堆栈中,但我看不到实际求和的位置。当在方法内部而不是在方法之外声明变量和时,还会节省多少内存。

private int size(BSTNode current) {
        if (current == null) {
            return 0;
        }
    int sum = 1;
    sum += size(current.getLeft());
    sum += size(current.getRight());
    return sum;
    }

2 个答案:

答案 0 :(得分:0)

假设您加入了公司一个部门的负责人,并希望了解在该部门工作的总人数。此外,还有2名负责人员,一名负责工程,一名负责商务。现在,为了计算人数,你可以到办公室去数数。 (但这很乏味,除此之外,担任分部负责人的重点是什么。)

或者,你可以做的是让你的工程主管找出在他下面工作的人,说x并要求业务负责人找出在他下工作的人,y。因此,在该部门工作的总人数为x+y+1(1适合您)。

现在,你可以假设工程主管将有2名监督员,他要求他们找出每个监督员监督的人数。因此,工程团队的总人数为people_under_supervisor_1 + people_under_supervisor_2 + 1(工程负责人为1人)。所以,在。

同样,您可以假设一个类似的过程涉及由业务负责人查找业务部门的人数。

该代码执行相同操作,找到左子树的大小,找到右子树的大小,并为当前节点添加1 。 这就是算法的工作方式。我希望这个类比有所帮助。

现在,关于“当在方法内部而不是方法之外声明变量和时,会节省多少内存。” 实际上 在递归函数中声明局部变量时会使用更多内存 。声明任何局部变量时,在堆栈中分配内存位置,并且在该局部变量的范围完成之前,该内存位置不能用于其他目的。因此,当下一个函数被调用size(current.getLeft())时,所有变量都保留在堆栈中,并通过调用size创建局部变量size(current.getLeft())的新内存位置。只要函数仍未返回结果,size的实例就会保留在内存中。

观看此视频,https://www.youtube.com/watch?v=_8-ht2AKyH4以更清楚地了解堆栈。

答案 1 :(得分:0)

您的代码的作用:

int sum = 1;                      // +1 for current node
sum += size(current.getLeft());   // +size of leftSubtree of current node
sum += size(current.getRight());  // +size of rightSubtree of current node

你从root开始,一直到每个节点直到叶子节点,然后从底部返回,当它上升时,为每个节点完成+1。

在实际尝试计算节点数时,使用变量名sum会产生误导。使用countnode_count

等名称