我不明白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;
}
答案 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
会产生误导。使用count
或node_count