미만의 값 검색 대학 업무용 이진 트리에 대한 알고리즘을 만들고 있으며 지정된 값보다 작은 모든 값을 효율적으로 찾는 알고리즘을 개발해야합니다 (순서가 필요합니다).바이너리 트리
10
/\
9 11
/ \
5 15
/\ /\
1 8 13 19
/\
12 14
이것은 내가 생각해 낸 해결책입니다 (위의 그래프는 이진 트리가 어떻게 보이는지 잊어 버린 경우를 대비 한 것입니다).
private BinaryTreeNode root;
public int[] getBeforeJoinedNum(int num){
usersInOrder = new ArrayList<User>();
beforeNum(num, root);
return usersInOrder;
}
private void beforeNum(int num, BinaryTreeNode n){
if (n != null){
beforeNum(num, n.getLeft());
int nodeValue = n.getValue();
if (num<nodeValue){
usersInOrder.add(n.getValue());
beforeNum(num, n.getRight());
}
}
}
이 알고리즘의 문제점은 불필요한 비교를한다는 것입니다. 예를 들어, 10보다 작은 모든 숫자를 원한다면 코드는 10보다 작 으면 9의 왼쪽 (즉, 1,5,8)을 모두 검사합니다. 반면 9보다 작은 것은 분명히 있어야합니다. 목록에서 비교할 필요없이
어떻게이 알고리즘을보다 효율적으로 만들 수 있습니까? 안타깝게도 데이터 구조가 교과 과정의 핵심이기 때문에 Java 컬렉션 프레임 워크를 사용할 수 없습니다. 나는 또한 beforeNum
의 논리 버그를 수정
private void addAll(UserNode n) {
if (n == null) return;
addAll(n.getLeft());
usersInOrder.add(n.getValue());
addAll(n.getRight());
}
private void beforeNum(int num, UserNode n){
if (n == null) return;
if (n.getValue() < num) {
addAll(n.getLeft());
usersInOrder.add(n.getValue());
beforeNum(num, n.getRight());
} else {
beforeNum(num, n.getLeft());
}
}
참고 :
당신은 그들이 재산을 다 알고있는 하위 트리를 들어
'BinaryTreeNode'는'UserNode'와 어떤 관련이 있습니까? –
주어진 부모의 모든 자식을 가져 오는 메소드를 작성하십시오. 그런 다음 한 가지 비교를하십시오. if (num
leigero
'root'가 무엇이든 초기화되지 않는 것처럼 보입니다. 'if (n! = null)'이 결코 참이되지 않습니다. – aliteralmind