문제

나는 할당을 요청하는 나를 구현하는 AVL 나무입니다.난데없이는 회전 방법을 정확하지만,문제가 있음을 알아내는 그들을 사용하는 경우.

예를 들어,설명은 이 책에서 말하는 내가 올라가 동일한 경로 내려 갔을 삽입하는 노드/요소입니다.그러나 나는 가질 수 없는 부모 포인터입니다.

최신 코드:

public BinaryNode<T> insert(BinaryNode<T> node) {
    if (this.getElement().compareTo(node.getElement()) > 0) {
        if (this.getLeftChild() != null) {
            BinaryNode<T> b = this.getLeftChild().insert(node);

            if(!this.isBalanced()) {
                this.balance();
            }

            return b;
        } else {
            this.setLeftChild(node);
        }

    } else if (this.getElement().compareTo(node.getElement()) < 0) {
        if (this.getRightChild() != null) {
            return this.getRightChild().insert(node);
        } else {
            this.setRightChild(node);
        }
    }

    return this;
}

무엇을 원하는 여기에 다시 올라가서 나무,그러나 그것만 확인할 수 있는 균형을 잡는 그 후에 삽입합니다.따라서,이에있는 다른 절입니다.

도를 넣어 밸런스 코드는 사무엘 Klatchko 제안,그러나 확인 밸런스에서 각각 삽입합니다.예를 들어:면 삽입 7,9,5,3,1 연속적으로,I get a null pointer 제외하려고 할 때를 삽입하려면 1.

편집:하나의 이유로 상기할 수 있는 방법으로 할 것이었을 높이입니다.그것은 잘 작동 하나인 회전하는 경우 내가 계산한 높이의 모든 시간에 높이()하지만 나누 O(로그(n))간의 AVL 나무입니다.

어떤 생각에서 이러한 목표를 달성하는 방법?

도움이 되었습니까?

해결책

당신은 코드가 상승 같은 경로를 당신이 내려 갔다.이 코드:

if (this.getLeftChild() != null) {
    return this.getLeftChild().insert(node);
} 

와 약간 수정:

if (this.getLeftChild() != null) {
    boolean b = this.getLeftChild().insert(node);
    // do something here
    return b;
} 

코드 반환에서 재귀적인 통화,각 반환에 당신을 제공합니다.지 않은 즉시 반환하는 값을 재귀적인 통화,당신이 할 수있는 기회를 당신의 재조정을 예로 들었다.

업데이트에 대한 최신 코드

는 것을 잊지 않을 재조정할 때 이를 삽입니다.

다른 팁

당신이 시도할 수 있는 전달하는 부모의 포인터로 insert 방법,또는 당신 수 있으로 변환 insert 으로 반복적인 방법을 명시적인 스택에서는 레코드의 경로를 아래로 나무입니다.

에 의해 방법을 선택 하기 위해서는 회 사용할 수 있습니다 단지 알고 있는 노드가 불균형이 있는지 여부를 알고 깊은 하위트리에 오른쪽 또는 왼쪽에 있습니다.즉 당신의 간단한 isBalanced 방법은 아주 충분하다.그것은 또한 비효율적이고,불어 AVL 나무의 O(로그 n) 복잡하기 때문에,당신이 컴퓨팅 높습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top