Wie Sie das nächste Element zu einem bestimmten Schlüsselwert in einem binären Suchbaum finden?

stimmen
15

Bei einer bst mit ganzzahligen Werten als Schlüssel, wie kann ich den nächsten Knoten in einem bst zu diesem Schlüssel finden? Die BST wird mit einem Objekt von Knoten (Java) dargestellt. Closest für zB 4,5,9 sein, und wenn der Schlüssel 6 ist, wird es 5 zurückkehren ..

Veröffentlicht am 02/06/2011 um 01:50
quelle vom benutzer
In anderen Sprachen...                            


11 antworten

stimmen
-1

Die einfachste Lösung ist Ihr Baum Rekursion seit wann

  • Sie finden das Element
  • Sie erreichen ein Blatt. Dieser Fall sollten Sie ein paar Vergleich zu machen, um zu bestimmen, ob der nächste Wert das Blatt oder die Eltern des Blattes ist.

Bis zu Ihnen die Umsetzung.

Beantwortet am 02/06/2011 um 02:02
quelle vom benutzer

stimmen
18

Traverse der Baum als würden Sie das Element zu finden. Während Sie tun, dass der Wert Datensatz, der am nächsten zu Ihrem Schlüssel. Nun, wenn Sie nicht einen Knoten für den Schlüssel finden sich die aufgezeichnete Wert zurück.

Also , wenn Sie wurden nach dem Schlüssel suchen 3in dem folgenden Baum würden Sie auf dem Knoten am Ende 6ohne eine Übereinstimmung zu finden , aber Ihr aufgezeichneter Wert wäre , 2da dies der nächste Schlüssel aller Knoten war , die Sie (überquert hatten 2, 7, 6).

                 2
              1      7
                   6   8
Beantwortet am 02/06/2011 um 02:03
quelle vom benutzer

stimmen
11

Traverse nimmt O (n) Zeit. Können wir gehen es in oben-unten? wie dieser rekursiven 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;
}
Beantwortet am 08/06/2011 um 09:41
quelle vom benutzer

stimmen
8

Es kann in O (log * n *) Zeit gelöst werden.

  • Wenn der Wert in einem Knoten gleich dem vorgegebenen Wert ist, dann ist es der nächste Knoten;
  • Wenn der Wert in einem Knoten größer als der vorgegebene Wert ist, nach links Kind bewegen;
  • Wenn der Wert in einem Knoten weniger als der vorgegebenen Wert ist, bewegen sich nach rechts Kind.

Der Algorithmus kann mit dem folgenden C ++ Code implementiert werden:

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

Sie können besuchen Sie mein Blog für weitere Details.

Beantwortet am 14/03/2013 um 03:19
quelle vom benutzer

stimmen
0

Dies kann mit einer Queue und eine Arraylist durchgeführt werden. Queue verwendet wird, um eine Breitensuche auf dem Baum auszuführen. Arraylist wird verwendet werden, um das Element des Baumes in der Breite erster Ordnung zu speichern. Hier ist der Code, das gleiche zu implementieren

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;
}
Beantwortet am 15/01/2014 um 14:06
quelle vom benutzer

stimmen
2

Das Problem mit dem Ansatz „von links nach rechts Traversal und der Suche nach dem nächsten“ ist, dass es über die Reihenfolge abhängt, in den Elemente eingegeben wurden BST zu erstellen. Wenn wir 11 für die BST-Sequenz 22 suchen, 15, 16, 6,14,3,1,90, wird das obige Verfahren 15 zurückzukehren, während die richtige Antwort ist 14. Die einzige Methode sollte Rekursion verwendet alle Knoten zu durchqueren, die nächstgelegene als Ergebnis der rekursiven Funktion zurückkehrt. Das wird uns den nächsten Wert

Beantwortet am 02/06/2014 um 18:02
quelle vom benutzer

stimmen
9

Hier ist eine rekursive Lösung 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)
Beantwortet am 21/06/2014 um 23:44
quelle vom benutzer

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

}
Beantwortet am 24/07/2016 um 05:45
quelle vom benutzer

stimmen
0

Im Folgenden arbeitet man mit verschiedenen Proben, die ich habe.

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;
}
Beantwortet am 04/02/2017 um 10:10
quelle vom benutzer

stimmen
0

Hier ist der vollständige Java-Code das nächste Element in einem BST zu finden.

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

        }
Beantwortet am 11/06/2018 um 20:33
quelle vom benutzer

stimmen
0

Hier ist die Arbeitslösung in Java, die die Eigenschaften von BST und zusätzlicher Ganzzahl verwendet minimale Differenz zu speichern

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

Laufzeit Komplexität - O (log N)

Raum-Zeit-Komplexität - O (1)

Beantwortet am 08/09/2018 um 18:23
quelle vom benutzer

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