Reputation: 7133
HERE is the c++ implementation for right view of binary tree without using queue. When I try to convert it to Java, it is not working. Here is my Java code:
(I think most likely it is because I have not understood the algorithm properly and handling of 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);
}
Upvotes: 3
Views: 224
Reputation: 10565
In the spirit of @lifus' answer, but avoiding mutable state, you can use the function return to set 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
}
Upvotes: 2
Reputation: 8482
Java is pass by value.
i.e. maxLevel = level;
doesn't affect other maxLevel
values.
In you case, you should remove parameter maxLevel
and use static variable instead:
private static int maxLevel;
public static void rightView(TreeNode tNode){
maxLevel = 0;
rViewUtil(tNode, 1);
}
public static void rViewUtil(TreeNode tNode, int level){
...
}
Note: It's not thread safe
Alternatively, you may use 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);
}
}
It stores volatile int under the hood.
Note: As @Daniel mentioned, it's in concurrent package and intended for multithreading applications.
Another option is to create your "own" mutable integer or reuse an existing one.
Upvotes: 2