code: def _search_in_tree(self, key, node) -> "Node":
      if isinstance(node, (LonelyRootNode, LeafNode)):
          return node
  
      page = None
  
      if key < node.smallest_key:
          page = node.smallest_entry.before
  
      elif node.biggest_key <= key:
          page = node.biggest_entry.after
  
      else:
          for ref_a, ref_b in utils.pairwise(node.entries):
              if ref_a.key <= key < ref_b.key:
                  page = ref_a.after
                  break
  
      assert page is not None
  
      child_node = self._mem.get_node(page)
      child_node.parent = node
      return self._search_in_tree(key, child_node)
  
imports: from functools import partial
  from logging import getLogger
  from typing import Optional, Union, Iterator, Iterable
  from .None import utils
  from .const import TreeConf
  from .entry import Record, Reference, OpaqueData
  from .memory import FileMemory
  from .node import Node, LonelyRootNode, RootNode, InternalNode, LeafNode, OverflowNode
  from .serializer import Serializer, IntSerializer
label_desc: Use image node_id 24 for calling the BPlusTree obj's underlying member method code with example usage: obj._search_in_tree(key, node) and returns: self, node