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 ..
Hoe de dichtstbijzijnde element op een bepaalde sleutel waarde in een binaire zoekboom vinden?
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.
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
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;
}
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.
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;
}
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
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)
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);
}
}
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;
}
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);
}
}
}
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)













