BST의 n 번째 항목이 보유한 데이터를 반환하려고합니다. 카운터를 사용하여 inorder 순회를 수행하려고합니다. 카운터가 n보다 큰 경우 현재를 반환합니다. 마디. 현재 코드가 항상 첫 번째 항목을 반환하는 것으로 보이고 논리가 잘못된 부분을 볼 수 없습니다. 나는 n 번째 및 inOrder 메서드 만 썼고 나머지는 제공되었습니다. 나는 내가 너무 자주 카운터를 증가시키고 있다고 생각한다. 아래에서 테스트 할 주요 메소드를 게시 할 것이다.BST의 n 번째 항목 가져 오기
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));
}
}
메서드가 호출 될 때마다 필드를 수정하므로 예입니다. 너무 자주 증가합니다. –
가장 왼쪽 항목에 올 때까지 증가하지 않으시겠습니까? 그런 다음 메서드를 호출 할 때마다 증가시키고 싶습니다. 그래서 node.left가 null이면 c를 증가시킬 수 있습니다. 나는 거기에 바른 길을 가고 있는가? – Chaz