簡體   English   中英

迭代查找AVL樹中的節點

[英]Find a node in an AVL tree iteratively

有人知道如何迭代搜索AVL樹中的特定節點嗎? 我的意思是,由於樹的高度復雜。 我寫了一些代碼,但實際上我不知道如何迭代搜索節點(遞歸不會有問題):

public class AuDTree<E extends Comparable<? super E>> implements AuDTreeInterface<E> {

private class Node{

    public Node left;
    public Node right;
    public Node parent;
    public E value;

    public Node(E value){
        left = null;
        right = null;
        parent = null;
        this.value = value;
    }

}

public Node root;

public AuDTree(){
    this.root = null;
}


@Override
public boolean isEmpty() {
    if(root == null){
        return true;
    }
    else{
        return false;
    }

}

@Override
public int count() {

    return count(root);

}

private int count(Node n) {
    if (n == null) {
        return 0;
    }
    if (n.left == null && n.right == null) {
        return 1;
    } else {
        return count(n.left) + count(n.right);
    }
}

@Override
public int getHeight() {
    return getHeight(root);
}

private int getHeight(Node n) {
    if (n == null) {
        return -1;
    }
    return Math.max(getHeight(n.left), getHeight(n.right)) + 1;
}

@Override
public boolean isAVLTree() {
    return isAVLTree(root);
}

public boolean isAVLTree(Node n){
     Node prev = null;

        if(root == null)
        {
            if(!isAVLTree(root.left))
            return false;

            if(prev != null && root.value.compareTo(prev.value) <= 0)
                return false;
            prev = root;
            return isAVLTree(root.right);
        }
        return true;
}

@Override
public boolean contains(E value) {
if(isEmpty()) return false;
        else if(value == root) return true;
        else{

在此先感謝:)

AVL樹只是一種特殊的二進制搜索樹,您可以用相同的方式搜索它

我們首先檢查根節點。 如果樹為空,則我們要搜索的鍵在樹中不存在。 否則,如果鍵等於根的鍵,則搜索成功,並且我們返回節點。 如果鍵小於根的鍵,則搜索左子樹。 同樣,如果鍵大於根的鍵,則搜索正確的子樹。 重復此過程,直到找到密鑰或其余子樹為空。 如果在到達空子樹之前未找到搜索到的密鑰,則該樹中不存在該密鑰。

對於您的實現,它看起來像這樣:

public boolean contains(E value) {
    Node current = root;

    while (current != null) {
        int comparison = value.compareTo(current.value);
        if (comparison == 0) {
            return true;
        } else if (comparison < 0) {
            current = current.left;
        } else { //comparison > 0
            current = current.right;
        }
    }

    return false;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM