Java中不使用队列的二叉树右视图 是二叉树右视图的C++实现,不使用队列。当我尝试将其转换为Java时,它不起作用。以下是我的Java代码:

Java中不使用队列的二叉树右视图 是二叉树右视图的C++实现,不使用队列。当我尝试将其转换为Java时,它不起作用。以下是我的Java代码:,java,algorithm,binary-tree,Java,Algorithm,Binary Tree,(我认为很可能是因为我没有正确理解算法和maxLevel指针/引用的处理) publicstaticvoidrightview(treenodetnode){ int maxLevel=0; rViewUtil(tNode,1,maxLevel); } 公共静态void rViewUtil(TreeNode tNode,int-level,int-maxLevel){ if(tNode==null) 返回; 如果(最大电平

(我认为很可能是因为我没有正确理解算法和maxLevel指针/引用的处理)

publicstaticvoidrightview(treenodetnode){
int maxLevel=0;
rViewUtil(tNode,1,maxLevel);
}
公共静态void rViewUtil(TreeNode tNode,int-level,int-maxLevel){
if(tNode==null)
返回;
如果(最大电平<电平){
System.out.print(tNode.value+“”);
maxLevel=级别;
}
rViewUtil(tNode.right,level+1,maxLevel);
rViewUtil(tNode.left,level+1,maxLevel);
}
Java是

i、 e.
maxLevel=level不影响其他
maxLevel

在您的情况下,您应该删除参数
maxLevel
,而使用静态变量:

private static int maxLevel;

public static void rightView(TreeNode tNode){
    maxLevel = 0;
    rViewUtil(tNode, 1);
}

public static void rViewUtil(TreeNode tNode, int level){
    ...
}
注意:它不是线程安全的


或者,您可以使用:

publicstaticvoidrightview(treenodetnode){
rViewUtil(tNode,1,新的AtomicInteger());
}
公共静态void rViewUtil(TreeNode tNode,int级别,AtomicInteger maxLevel){
...
if(maxLevel.get()
它在引擎盖下储存int

注意:@Daniel提到,它位于并发包中,用于多线程应用程序



另一个选项是创建“自己的”或重用。

本着@lifus回答的精神,但避免可变状态,您可以使用函数return设置
maxLevel

public static void rightView(TreeNode tNode){
    int maxLevel = 0;
    rViewUtil(tNode, 1,maxLevel);
}

public static int rViewUtil(TreeNode tNode, int level, int maxLevel){
    if(tNode==null)
        return;
    if(maxLevel < level){
        System.out.print(tNode.value + " ");
        maxLevel = level;
    }
    maxLevel = rViewUtil(tNode.right, level+1, maxLevel);
    maxLevel = rViewUtil(tNode.left, level+1, maxLevel);
    return maxLevel
}
publicstaticvoidrightview(treenodetnode){
int maxLevel=0;
rViewUtil(tNode,1,maxLevel);
}
公共静态int-rViewUtil(TreeNode-tNode,int-level,int-maxLevel){
if(tNode==null)
返回;
如果(最大电平<电平){
System.out.print(tNode.value+“”);
maxLevel=级别;
}
maxLevel=rViewUtil(tNode.right,level+1,maxLevel);
maxLevel=rViewUtil(tNode.left,level+1,maxLevel);
返回最大电平
}

@lifus非常感谢您的回复。我知道这就是问题所在,但我仍然不能很好地理解它。我仍然在每次向函数调用传递maxLevel,所以无论是按值传递还是按引用传递。。。这种变化不应该反映在其他电话中吗??我知道我在这里遗漏了一些与回调相关的简单内容。不要使用AtomicInteger,它是用于并发应用程序的,而不是用于引用。不幸的是,没有内置的可变整数对象,但您可以很容易地创建自己的对象。@DavidS没有得到它。@Daniel谢谢。我遇到了这个。。。您能建议如何编写一个简单且不太全面的可变整数包装器吗?@Daniel我同意,这只是一个可以避免共享可变状态的示例。谢谢您的回复。但我还没有发现问题。无论如何,我每次都要通过更新的MaxLevel,那么问题出在哪里呢。我已经差不多做到了。。我仍然不明白当前的代码是如何产生问题的。请给出一个例子,并用两行解释为什么我的当前代码不起作用(我知道这与传递值有关..但如何做?)问题是您在函数中设置了
maxLevel
的值。在C++中,您所做的递归调用和调用方都会看到在内存区域<代码> INT*Max Leals/Cuth>点中所做的更改。在Java翻译中,只有后续递归调用看到更改,而不是调用方。是的,这确实是最好的选择。
public static void rightView(TreeNode tNode){
    rViewUtil(tNode, 1, new AtomicInteger());
}

public static void rViewUtil(TreeNode tNode, int level, AtomicInteger maxLevel){
    ...
    if(maxLevel.get() < level){
        ...
        maxLevel.set(level);
    }
}
public static void rightView(TreeNode tNode){
    int maxLevel = 0;
    rViewUtil(tNode, 1,maxLevel);
}

public static int rViewUtil(TreeNode tNode, int level, int maxLevel){
    if(tNode==null)
        return;
    if(maxLevel < level){
        System.out.print(tNode.value + " ");
        maxLevel = level;
    }
    maxLevel = rViewUtil(tNode.right, level+1, maxLevel);
    maxLevel = rViewUtil(tNode.left, level+1, maxLevel);
    return maxLevel
}