Ich versuche, die Daten durch die n-te Element eines BST gehalten zurückzukehren, Ich versuche, eine Inorder Traversal mit einem Zähler zu tun, und wenn der Zähler größer als n ist, geben Sie die aktuelle Knoten. Mein aktueller Code scheint immer den ersten Eintrag zurückzugeben, und ich kann nicht sehen, wo meine Logik falsch ist. Ich habe nur die nth- und inOrder-Methoden geschrieben, der Rest wurde bereitgestellt. Ich denke, dass ich meinen Zähler zu oft inkrementiere, ist das die Ursache oder mache ich etwas anderes falsch. Ich werde auch unten die Hauptmethode veröffentlichen, mit der ich gerade teste.Erste n-ten Element eines BST
import java.util.NoSuchElementException;
public class BST {
private BTNode<Integer> root;
public BST() {
root = null;
}
public boolean insert(Integer i) {
BTNode<Integer> parent = root, child = root;
boolean goneLeft = false;
while (child != null && i.compareTo(child.data) != 0) {
parent = child;
if (i.compareTo(child.data) < 0) {
child = child.left;
goneLeft = true;
} else {
child = child.right;
goneLeft = false;
}
}
if (child != null)
return false; // number already present
else {
BTNode<Integer> leaf = new BTNode<Integer>(i);
if (parent == null) // tree was empty
root = leaf;
else if (goneLeft)
parent.left = leaf;
else
parent.right = leaf;
return true;
}
}
public int greater(int n) {
if (root == null) {
return 0;
}
else {
return n;
}
}
int c = 0;
public int nth(int n) throws NoSuchElementException {
BTNode<Integer> node = null;
if (root == null) {
throw new NoSuchElementException("Element " + n + " not found in tree");
}
else {
if (root != null){
node = inOrder(root, n);
}
}
return node.data;
}
public BTNode inOrder(BTNode<Integer> node, int n) {
c++;
while (c <= n) {
if (node.left != null) {
inOrder(node.left, n);
}
c++;
if (node.right != null) {
inOrder(node.right, n);
}
}
return node;
}
}
class BTNode<T> {
T data;
BTNode<T> left, right;
BTNode(T o) {
data = o;
left = right = null;
}
}
public class bstTest {
public static void main(String[] args) {
BST tree = new BST();
tree.insert(2);
tree.insert(5);
tree.insert(7);
tree.insert(4);
System.out.println(tree.nth(2));
}
}
Sie ändern ein Feld jedes Mal, wenn eine Methode aufgerufen wird, also ja. Zu oft inkrementieren –
Ich möchte nicht erhöhen, bis ich am äußersten linken Punkt rechts bin? und dann werde ich jedes Mal inkrementieren, wenn ich die Methode anrufe? Also könnte ich hinzufügen, wenn node.left null ist und dann increment c. Gehe ich dort richtig? – Chaz