当前位置: 首页 > 知识库问答 >
问题:

递归中的变量被重置。有人能解释一下吗?

杨骏
2023-03-14

我试图从Leetcode解决这个问题https://leetcode.com/problems/count-good-nodes-in-binary-tree/

这是我的解决方案:我无法理解为什么这个递归是来自根的计数值。左节点在遍历根时不起作用。正当据我所知,我是

  1. 检查当前节点是否良好并更新计数和列表
  2. 遍历左节点更新计数
  3. 上面的count应该在遍历右节点时进入右节点并更新计数值,但没有发生

为什么这不起作用。我知道正确的解决方案,只是不能真正理解递归如何重置我的计数变量

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode() {}
     *     TreeNode(int val) { this.val = val; }
     *     TreeNode(int val, TreeNode left, TreeNode right) {
     *         this.val = val;
     *         this.left = left;
     *         this.right = right;
     *     }
     * }
     */
    class Solution {
        public int goodNodes(TreeNode root) {
            int count = 0;
            List<Integer> list = new ArrayList<>();
            TreeNode treeroot = root;
            preorderGoodNodes(root,list,count,treeroot);
            return count; 
        }
        
       public void  preorderGoodNodes(TreeNode root,List<Integer> list,int count,TreeNode treeroot)
       {
        
           if(root==null) // check if root is null
               return;
           
           // if current node is actual root of the tree then count ++ since root is always good
           //also add the root to the list
           if(treeroot ==root) 
           {
               count++;
               list.add(root.val);
           }
           else
               // if node is not the root then check if it is good or not by looking into the list
           {  
                   int flag = 0;
                   for(int x : list) //looking into the list
                   {
                       if(x>root.val)
                       {
                           flag = 1;
                           break;
                       }
    
                   }
    
                   if(flag==0) // if it is good count++
                           count++;
                       
               list.add(root.val); // weather good or not add to the list
    
           }
           
           List<Integer> rightlist = new ArrayList<>(list); 
           // make a copy of the list to send to right node 
           //because count and list from left tree should not effect right tree
           
           preorderGoodNodes(root.left,list,count,treeroot);
**// why does count reset after this line ??**
           preorderGoodNodes(root.right,rightlist,count,treeroot);
           
       }
    }

共有1个答案

干宏邈
2023-03-14

如果需要“通过引用传递”语义,可以使用大小为1AtomicIntegerint[]而不是int

 类似资料:
  • 对于下面的方法,调用神秘(45)时,输出为“1 0 1 1 0:2 5 11 22 45”,我明白为什么“1 0 1 1 0:”打印出来,但不明白冒号后“2 5 11 22 45”是怎么打印出来的,有人能给我解释一下吗?我试着写出来,但就是想不通。

  • 我这里有一些关于Java的练习问题。我们应该在不使用编译器的情况下确定答案。 参考以下方法: 调用product(6)时的输出是什么? D)48 E)70 根据答案,正确的输出是48。我真的不明白为什么这是真的。6不符合基本情况,所以转到else语句。那么,乘积(6-2)=乘积(4),乘积(2)得到乘积(0),乘积(2)得到乘积(0),得到6*4,4*2,2*0,0*0。但那是32,不是48?是不

  • 我试图拼凑这个例子中的逻辑。这是正常的代码。仅供参考,我有一个大学导师帮我做这个例子,但他仍在试图找出如何向我解释它。代码也做好了,这个只是为了自己的递归知识。 这是带有标记的测试代码,我用它来找出什么时候发生了什么。这有点碍眼,所以如果你认为不用看这一团糟就可以解释的话,那一定要。 直到第一颗星星印出来我才明白。在printTriangle方法将其减至0后,我打印了n的值,然后在打印第一颗星之前

  • 我想写一个brainfuck口译员,但我错过了一些上下文或其他东西。应该被调用以处理“

  • 我是Hibernate和JPA的新手,我对这个注释有问题。有人能简单地解释一下这个注释到底在做什么吗?因为在这种情况下,文档对我来说很难理解。 编辑我明白什么是持久上下文,但在代码中,我有这样的例子: 我对@PerustenceContext做什么有问题。抱歉,也许我没有具体说明。

  • 我不知道“?”和“:”的用法。