为什么我们在这个代码中使用maxvalue两次


  1. 这里max_value初始化为静态变量一次,值为0,但为什么在函数leftView??中再次初始化它???

  2. 在没有初始化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;行会发生什么:

  1. 加载类,在内存中分配静态变量,并初始化为0
  2. 调用递归leftViewUtil方法时,level等于1
  3. 条件if (max_level < level)被评估为真:0 < 1
  4. max_level被赋予值1
  5. leftViewUtil的附加调用可以传入level的更高值,从而进一步递增max_level;再也没有人降低它了

现在考虑如果您第二次运行函数会发生什么

  1. 类已经加载,因此不会进行额外的初始化;max_level保留其旧值(假设1(
  2. 调用递归leftViewUtil方法时,level等于1
  3. 条件if (max_level < level)被评估,但这次是检查1 < 1,所以它是false
  4. 整件事都出了问题

通过在公共leftView方法中向max_level添加额外的赋值,我们重置每次调用的状态,确保类是可重用的。

正如其他人所说,有完全不同的算法实现根本不使用静态变量;但是如果你使用一个,你需要在每次打印一个新的树时重置它。

最新更新