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 ..
Wie Sie das nächste Element zu einem bestimmten Schlüsselwert in einem binären Suchbaum finden?
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.
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
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;
}
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.
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;
}
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
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)
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);
}
}
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;
}
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);
}
}
}
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)













