Java 中不使用队列的二叉树右视图

Right view of binary tree without using queue in Java

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

(我想很可能是因为我没有正确理解算法和maxLevel的处理pointers/reference)

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

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

Java 是 pass by value

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){
    ...
}

注意:它不是线程安全的


或者,您可以使用 AtomicInteger:

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);
    }
}

它在后台存储 volatile int。

注意:如@Daniel 所述,它位于并发包中,用于多线程应用程序。


另一种选择是创建您的 "own" mutable integer or reuse an existing one.

本着@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
}