Comment trouver l'élément le plus proche d'une valeur de clé dans un arbre de recherche binaire?

voix
15

Compte tenu d'un bst avec des valeurs entières comme clés Comment trouver le noeud le plus proche de cette clé dans un bst? Le BST est représenté en utilisant un objet de noeuds (Java). Le plus proche sera pour exemple 4,5,9 et si la clé est de 6, il retournera 5 ..

Créé 02/06/2011 à 01:50
source utilisateur
Dans d'autres langues...                            


11 réponses

voix
-1

La solution la plus simple est de récursivité votre arbre depuis quand

  • vous trouvez l'élément
  • vous atteignez une feuille. Ce cas vous devriez faire quelques comparaison pour déterminer si la valeur la plus proche est la feuille ou le parent de la feuille.

À vous la mise en œuvre.

Créé 02/06/2011 à 02:02
source utilisateur

voix
18

Traverse l'arbre comme vous le feriez pour trouver l'élément. Alors que vous faites cet enregistrement la valeur qui est la plus proche de votre clé. Maintenant, quand vous n'avez pas trouvé un noeud pour la clé elle-même renvoie la valeur enregistrée.

Donc , si vous recherchez la clé 3dans l'arborescence suivante vous finiriez sur le nœud 6sans trouver un match , mais votre valeur enregistrée seriez 2car cela a été le plus proche clé de tous les noeuds que vous aviez traversé ( 2, 7, 6).

                 2
              1      7
                   6   8
Créé 02/06/2011 à 02:03
source utilisateur

voix
11

Traverse prend O (n). Peut-on procéder en haut vers le bas? comme ce code récursif:

Tnode * closestBST(Tnode * root, int val){
    if(root->val == val)
        return root;
    if(val < root->val){
        if(!root->left)
            return root;
        Tnode * p = closestBST(root->left, val);
        return abs(p->val-val) > abs(root->val-val) ? root : p;
    }else{
        if(!root->right)
            return root;
        Tnode * p = closestBST(root->right, val);
        return abs(p->val-val) > abs(root->val-val) ? root : p;
    }   
    return null;
}
Créé 08/06/2011 à 09:41
source utilisateur

voix
8

Il peut être résolu en O (log * n *) temps.

  • Si la valeur d'un noeud est identique à la valeur donnée, il est le noeud le plus proche;
  • Si la valeur d'un nœud est supérieure à la valeur donnée, passez à l'enfant gauche;
  • Si la valeur d'un noeud est inférieure à la valeur donnée, passez à l'enfant le droit.

L'algorithme peut être mis en œuvre avec le code C ++:

BinaryTreeNode* getClosestNode(BinaryTreeNode* pRoot, int value)
{
    BinaryTreeNode* pClosest = NULL;
    int minDistance = 0x7FFFFFFF;
    BinaryTreeNode* pNode = pRoot;
    while(pNode != NULL){
        int distance = abs(pNode->m_nValue - value);
        if(distance < minDistance){
            minDistance = distance;
            pClosest = pNode;
        }

        if(distance == 0)
            break;

        if(pNode->m_nValue > value)
            pNode = pNode->m_pLeft;
        else if(pNode->m_nValue < value)
            pNode = pNode->m_pRight;
    }

    return pClosest;
}

Vous pouvez visiter mon blog pour plus de détails.

Créé 14/03/2013 à 03:19
source utilisateur

voix
0

Cela peut être fait en utilisant une file d'attente et un ArrayList. File d'attente sera utilisé pour effectuer une première recherche étendue sur l'arbre. ArrayList sera utilisé pour stocker l'élément de l'arbre en largeur premier ordre. Voici le code pour mettre en œuvre le même

Queue queue = new LinkedList();
ArrayList list = new ArrayList();
int i =0;
public Node findNextRightNode(Node root,int key)
{
    System.out.print("The breadth first search on Tree : \t");      
    if(root == null)
        return null;

    queue.clear();
    queue.add(root);

    while(!queue.isEmpty() )
    {
        Node node = (Node)queue.remove();
        System.out.print(node.data + " ");
        list.add(node);
        if(node.left != null) queue.add(node.left);
        if(node.right !=null) queue.add(node.right);            
    }

    Iterator iter = list.iterator();
    while(iter.hasNext())
        {
            if(((Node)iter.next()).data == key)
            {
                return ((Node)iter.next());
            }               
        }

    return null;
}
Créé 15/01/2014 à 14:06
source utilisateur

voix
2

Le problème avec l'approche « de gauche à droite et de trouver traversal le plus proche » est que cela dépend plus de la séquence dans laquelle des éléments ont été saisis pour créer BST. Si l'on recherche 11 pour la séquence de BST 22, 15, 16, 6,14,3,1,90, la méthode ci-dessus retourne 15 alors que la bonne réponse est 14. La seule méthode devrait utiliser la récursivité pour parcourir tous les nœuds, retourner le plus proche en tant que résultat de la fonction récursive. Cela va nous donner la valeur la plus proche

Créé 02/06/2014 à 18:02
source utilisateur

voix
9

Voici une solution récursive en Python:

def searchForClosestNodeHelper(root, val, closestNode):
    if root is None:
        return closestNode

    if root.val == val:
        return root

    if closestNode is None or abs(root.val - val) < abs(closestNode.val - val):
        closestNode = root

    if val < root.val:
        return searchForClosestNodeHelper(root.left, val, closestNode)
    else:
        return searchForClosestNodeHelper(root.right, val, closestNode)

def searchForClosestNode(root, val):
    return searchForClosestNodeHelper(root, val, None)
Créé 21/06/2014 à 23:44
source utilisateur

voix
0
void closestNode(Node root, int k , Node result) {
    if(root == null) 
    {
       return;      //currently result is null , so it  will be the result
    }
    if(result == null || Math.abs(root.data - k) < Math.abs(result.data - k) )
    {
      result == root;
    }
    if(k < root.data)
    {
    closestNode(root.left, k, result)
    } 
    else 
    {
        closestNode(root.right, k, result);
    }

}
Créé 24/07/2016 à 05:45
source utilisateur

voix
0

Ci-dessous, on travaille avec des échantillons différents que j'ai.

public Node findNearest(Node root, int k) {
    if (root == null) {
        return null;
    }
    int minDiff = 0;
    Node minAt = root;
    minDiff = Math.abs(k - root.data);

    while (root != null) {
        if (k == root.data) {
            return root;
        }
        if (k < root.data) {
            minAt = updateMin(root, k, minDiff, minAt);
            root = root.left;
        } else if (k > root.data) {
            minAt = updateMin(root, k, minDiff, minAt);
            root = root.right;
        }

    }
    return minAt;
}

private Node updateMin(Node root, int k, int minDiff, Node minAt) {
    int curDif;
    curDif = Math.abs(k - root.data);
    if (curDif < minDiff) {
        minAt = root;
    }
    return minAt;
}
Créé 04/02/2017 à 10:10
source utilisateur

voix
0

Voici le code complet de Java pour trouver l'élément le plus proche dans un BST.

        package binarytree;

        class BSTNode {
            BSTNode left,right;
            int data;

            public BSTNode(int data) {
                this.data = data;
                this.left = this.right = null;
            }
        }

        class BST {
            BSTNode root;

            public static BST createBST() {
                BST bst = new BST();
                bst.root = new BSTNode(9);
                bst.root.left = new BSTNode(4);
                bst.root.right = new BSTNode(17);

                bst.root.left.left = new BSTNode(3);
                bst.root.left.right= new BSTNode(6);

                bst.root.left.right.left= new BSTNode(5);
                bst.root.left.right.right= new BSTNode(7);

                bst.root.right.right = new BSTNode(22);
                bst.root.right.right.left = new BSTNode(20);

                return bst;
            }
        }

        public class ClosestElementInBST {
            public static void main(String[] args) {
                BST bst = BST.createBST();
                int target = 18;
                BSTNode currentClosest = null;
                BSTNode closestNode = findClosestElement(bst.root, target, currentClosest);

                if(closestNode != null) {
                    System.out.println("Found closest node: "   closestNode.data);
                }
                else {
                    System.out.println("Couldn't find closest node.");
                }
            }

            private static BSTNode findClosestElement(BSTNode node, int target, BSTNode currentClosest) {
                if(node == null) return currentClosest;

                if(currentClosest == null || 
                        (currentClosest != null && (Math.abs(currentClosest.data - target) > Math.abs(node.data - target)))) {
                    currentClosest = node;
                }

               if(node.data == target) return node;

                else if(target < node.data) {
                    return findClosestElement(node.left, target, currentClosest);
                }

                else { //target > node.data
                    currentClosest = node;
                    return findClosestElement(node.right, target, currentClosest);
                }
            }

        }
Créé 11/06/2018 à 20:33
source utilisateur

voix
0

Voici la solution de travail en Java qui utilise les caractéristiques de BST et entier supplémentaire pour stocker la différence minimum

public class ClosestValueBinaryTree {
        static int closestValue;

        public static void closestValueBST(Node22 node, int target) {
            if (node == null) {
                return;
            }
            if (node.data - target == 0) {
                closestValue = node.data;
                return;
            }
            if (Math.abs(node.data - target) < Math.abs(closestValue - target)) {
                closestValue = node.data;
            }
            if (node.data - target < 0) {
                closestValueBST(node.right, target);
            } else {
                closestValueBST(node.left, target);
            }
        }
    }

la complexité du temps d'exécution - O (logN)

complexité temporelle de l'espace - O (1)

Créé 08/09/2018 à 18:23
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more