How to find the closest element to a given key value in a binary search tree?

后端 未结 10 961
刺人心
刺人心 2020-12-25 14:58

Given a bst with integer values as keys how do I find the closest node to that key in a bst ? The BST is represented using a object of nodes (Java). Closest will be for eg 4

10条回答
  •  有刺的猬
    2020-12-25 15:37

    Here is the full Java code to find the closest element in a 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);
                    }
                }
    
            }
    

提交回复
热议问题