Gitt en bst med heltallsverdier som nøkler Hvordan finner jeg den nærmeste noden som nøkkel i en BST? BST er representert ved hjelp av en gjenstand av noder (Java). Nærmest vil være for eksempel 4,5,9 og hvis nøkkelen er 6 det vil returnere 5 ..
Hvordan finne nærmeste element til en gitt sentral verdi i et binært søketre?
Den enkleste løsningen er å recurse treet siden da
- du finner elementet
- du kommer til et blad. Denne saken bør du gjøre et par forhold for å avgjøre om den nærmeste verdien er bladet eller forelder til bladet.
Opp til deg implementeringen.
Traverse treet som du ville gjort for å finne elementet. Mens du gjør at posten verdien som er nærmest din nøkkel. Nå når du ikke fant en node for selve nøkkelen tilbake bokført verdi.
Så hvis du leter etter nøkkelen 3i følgende tre du vil ende opp på node 6uten å finne en match, men din ført verdi ville være 2siden dette var det nærmeste nøkkelen til alle noder som du hadde krysset ( 2, 7, 6).
2
1 7
6 8
Traverse tar O (n) tid. Kan vi fortsette den i topp-bunn? slik rekursiv kode:
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;
}
Det kan løses i O (log * n *) tid.
- Hvis verdien i en node er lik den gitte verdi, det er det nærmeste node;
- Hvis verdien i en node er større enn den angitte verdien, flytte til venstre barnet;
- Hvis verdien i en node er mindre enn den angitte verdien, flytt til høyre barn.
Algoritmen kan implementeres med følgende C ++ kode:
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;
}
Du kan besøke bloggen min for flere detaljer.
Dette kan gjøres ved hjelp av en kø og en Arraylist. Kø vil bli brukt til å utføre et bredde-først-søk på treet. Arraylist vil bli brukt til å lagre element av treet i bredden første orden. Her er koden for å implementere den samme
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;
}
Problemet med den tilnærmingen "venstre høyre traversering og finne det nærmeste" er at det avhenger over rekkefølgen elementer ble inngått for å skape BST. Hvis vi søker 11 for BST-sekvensen 22, 15, 16, 6,14,3,1,90, vil den ovennevnte fremgangsmåten returnere 15, mens det riktige svaret er 14. Den eneste metoden skal ved hjelp av rekursjon for å traversere alle nodene, returnere det nærmeste man som følge av den rekursive funksjonen. Dette vil gi oss den nærmeste verdien
Her er en rekursiv løsning i 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);
}
}
Under arbeider med forskjellige prøver som jeg har.
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;
}
Her er det full Java-kode for å finne nærmeste element i en 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);
}
}
}
Her er arbeidsoppløsningen i java som bruker egenskapene til BST og ytterligere heltall å lagre minste forskjell
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);
}
}
}
Kjør tid kompleksitet - O (løgn)
Rom-tid-kompleksitet - O (1)













