-
这里max_value初始化为静态变量一次,值为0,但为什么在函数leftView??中再次初始化它???
-
在没有初始化leftView函数中的max_value的情况下,当我在vscode中运行,但当我在gfg中提交它时,没有在leftView中初始化max_value函数我有错误为什么??
//code snippet for print left view of binary tree /* Class to print the left view */ class BinaryTree { Node root; static int max_level = 0; // recursive function to print left view void leftViewUtil(Node node, int level) { // Base Case if (node == null) return; // If this is the first node of its level if (max_level < level) { System.out.print(" " + node.data);//print node max_level = level; } // Recur for left and right subtrees leftViewUtil(node.left, level + 1);//its goes to left side of node and do level+1 leftViewUtil(node.right, level + 1);//its goes to right side of node and dolevel+1 } // A wrapper over leftViewUtil() void leftView() { max_level = 0; leftViewUtil(root, 1); } }
考虑如果类的顶部只有static int max_level = 0;
行会发生什么:
- 加载类,在内存中分配静态变量,并初始化为
0
- 调用递归
leftViewUtil
方法时,level
等于1
- 条件
if (max_level < level)
被评估为真:0 < 1
max_level
被赋予值1
- 对
leftViewUtil
的附加调用可以传入level
的更高值,从而进一步递增max_level
;再也没有人降低它了
现在考虑如果您第二次运行函数会发生什么:
- 类已经加载,因此不会进行额外的初始化;
max_level
保留其旧值(假设1
( - 调用递归
leftViewUtil
方法时,level
等于1
- 条件
if (max_level < level)
被评估,但这次是检查1 < 1
,所以它是false - 整件事都出了问题
通过在公共leftView
方法中向max_level
添加额外的赋值,我们重置每次调用的状态,确保类是可重用的。
正如其他人所说,有完全不同的算法实现根本不使用静态变量;但是如果你使用一个,你需要在每次打印一个新的树时重置它。