Hoe de dichtstbijzijnde element op een bepaalde sleutel waarde in een binaire zoekboom vinden?

stemmen
15

Gegeven een bst met gehele getallen als sleutels hoe kan ik het dichtst knooppunt naar die sleutel in een bst vinden? BST is weergegeven met behulp van een voorwerp knooppunten (Java). Dichtstbijzijnde zal zijn voor bijvoorbeeld 4,5,9 en als de sleutel is 6 het zal terugkeren 5 ..

De vraag is gesteld op 02/06/2011 om 01:50
bron van user
In andere talen...                            


11 antwoorden

stemmen
-1

De makkelijkste oplossing is om uw boom sinds wanneer recurse

  • vindt u het element
  • je een blad te bereiken. Dit geval moet u ervoor een paar vergelijking te bepalen of de dichtstbijzijnde waarde is het blad of de ouder van het blad.

Aan u de implementatie.

antwoordde op 02/06/2011 om 02:02
bron van user

stemmen
18

Traverse de boom als je zou het element te vinden. Terwijl je dat doet verslag van de waarde die het dichtst bij uw sleutel. Nu wanneer je hebt een knooppunt voor de sleutel zelf de opgenomen waarde te retourneren niet vinden.

Dus als je op zoek naar de sleutel 3in de volgende boom je zou eindigen op het knooppunt 6zonder het vinden van een wedstrijd, maar de opgenomen waarde zou zijn 2want dit was het dichtst sleutel van alle knooppunten die u had doorkruist ( 2, 7, 6).

                 2
              1      7
                   6   8
antwoordde op 02/06/2011 om 02:03
bron van user

stemmen
11

Traverse kost O (n) tijd. Kunnen we verder in de top-bottom? als dit recursieve code:

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;
}
antwoordde op 08/06/2011 om 09:41
bron van user

stemmen
8

Het kan worden opgelost in O (log * n *) tijd.

  • Als de waarde in een knooppunt is hetzelfde als de bepaalde waarde, het is het dichtstbijzijnde knooppunt;
  • Als de waarde in een knooppunt groter is dan de gegeven waarde, naar links kind;
  • Als de waarde in een knooppunt dan de gegeven waarde, naar rechts kind.

Het algoritme kan worden geïmplementeerd met de volgende C ++ code:

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;
}

U kunt een bezoek mijn blog voor meer informatie.

antwoordde op 14/03/2013 om 03:19
bron van user

stemmen
0

Dit kan gedaan worden met behulp van een wachtrij en een ArrayList. Queue zal worden gebruikt om een ​​breedte eerste zoekopdracht op de boom uit te voeren. ArrayList wordt gebruikt om het element van de boom slaan breedte eerste orde. Hier is de code voor dezelfde uitvoering

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;
}
antwoordde op 15/01/2014 om 14:06
bron van user

stemmen
2

Het probleem met de aanpak van "links rechts traversal en het vinden van de dichtstbijzijnde" is dat het afhankelijk is over de volgorde waarin elementen werden ingevoerd om BST te creëren. Als we op zoek 11 naar het BST sequentie 22, 15, 16, 6,14,3,1,90, zal bovenstaande werkwijze terug 15, terwijl het juiste antwoord 14. De enige methode moet gebruiken recursie alle knooppunten doorkruisen, retourneren van de dichtstbijzijnde als het resultaat van de recursieve functie. Dit zal ons de dichtstbijzijnde waarde te geven

antwoordde op 02/06/2014 om 18:02
bron van user

stemmen
9

Hier is een recursieve oplossing in 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)
antwoordde op 21/06/2014 om 23:44
bron van user

stemmen
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);
    }

}
antwoordde op 24/07/2016 om 05:45
bron van user

stemmen
0

Hieronder vindt men werkt met verschillende monsters die ik heb.

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;
}
antwoordde op 04/02/2017 om 10:10
bron van user

stemmen
0

Hier is de volledige Java-code naar de dichtstbijzijnde element in een BST vinden.

        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);
                }
            }

        }
antwoordde op 11/06/2018 om 20:33
bron van user

stemmen
0

Hier is de werkoplossing in java waarvan de karakteristieken van BST en aanvullende integer gebruikt om minimumverschil slaan

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);
            }
        }
    }

Looptijd complexiteit - O (logn)

Space tijd complexiteit - O (1)

antwoordde op 08/09/2018 om 18:23
bron van user

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