code: def insert_value(self, att_val, target_val, w):
      current = self
      antecedent = None
      is_right = False
  
      while current is not None:
          antecedent = current
          if att_val == current.att_val:
              self._update_estimator(current, target_val, w)
              return
          elif att_val < current.att_val:
              self._update_estimator(current, target_val, w)
  
              current = current._left
              is_right = False
          else:
              current = current._right
              is_right = True
  
      # Value was not yet added to the tree
      if is_right:
          antecedent._right = EBSTNode(att_val, target_val, w)
      else:
          antecedent._left = EBSTNode(att_val, target_val, w)
  
file_path: river/river/tree/splitter/ebst_splitter.py
imports: from __future__ import annotations
  import functools
  from river.stats import Var
  from ..utils import BranchFactory
  from .base import Splitter
label_desc: Use image node_id 4 for calling the EBSTNode obj's underlying member method code with example usage: obj.insert_value(att_val, target_val, w) without return types