class_docstr: Helper class that define basic operations of EFDT's nodes.
  
  It inherits from `LearningNode` and provides extra functionalities, while changing
  the splitting behavior of its parent class. This is an abstract class, since it does
  not implement all the inherited abstract methods from its parent class. BaseEDFTNode
  is designed to work with other learning/split nodes.
  
  Parameters
  ----------
  stats
      Class observations.
  depth
      The depth of the node in the tree.
  splitter
      The numeric attribute observer algorithm used to monitor target statistics
      and perform split attempts.
  kwargs
      Other parameters passed to the node.
class_docstr_tok: ["Helper","class","that","define","basic","operations","of","EFDT","'s","nodes",".","It","inherits","from","`","LearningNode","`","and","provides","extra","functionalities",",","while","changing","the","splitting","behavior","of","its","parent","class",".","This","is","an","abstract","class",",","since","it","does","not","implement","all","the","inherited","abstract","methods","from","its","parent","class",".","BaseEDFTNode","is","designed","to","work","with","other","learning\/split","nodes",".","Parameters","--","--","--","--","--","stats","Class","observations",".","depth","The","depth","of","the","node","in","the","tree",".","splitter","The","numeric","attribute","observer","algorithm","used","to","monitor","target","statistics","and","perform","split","attempts",".","kwargs","Other","parameters","passed","to","the","node","."]
docstr: Find possible split candidates without taking into account the
  null split.
  
  Parameters
  ----------
  criterion
      The splitting criterion to be used.
  tree
      The EFDT which the node belongs to.
  
  Returns
  -------
      The list of split candidates.
code: def best_split_suggestions(self, criterion, tree):
      """Find possible split candidates without taking into account the
      null split.
  
      Parameters
      ----------
      criterion
          The splitting criterion to be used.
      tree
          The EFDT which the node belongs to.
  
      Returns
      -------
          The list of split candidates.
      """
      maj_class = max(self.stats.values())
      # Only perform split attempts when the majority class does not dominate
      # the amount of observed instances
      if (
          maj_class
          and maj_class / self.total_weight > tree.max_share_to_split
      ):
          return [BranchFactory()]
  
      best_suggestions = []
      pre_split_dist = self.stats
  
      for idx, splitter in self.splitters.items():
          best_suggestion = splitter.best_evaluated_split_suggestion(
              criterion, pre_split_dist, idx, tree.binary_split
          )
          best_suggestions.append(best_suggestion)
  
      return best_suggestions
  
imports: from __future__ import annotations
  import copy
  import numbers
  from river.tree.utils import BranchFactory
  from river.utils.norm import normalize_values_in_dict
  from ..splitter.nominal_splitter_classif import NominalSplitterClassif
  from .branch import DTBranch, NominalBinaryBranch, NominalMultiwayBranch, NumericBinaryBranch, NumericMultiwayBranch
  from .htc_nodes import LeafMajorityClass, LeafNaiveBayes, LeafNaiveBayesAdaptive
  from .leaf import HTLeaf
label_desc: Use image node_id 2 for calling the BaseEFDTLeaf obj's underlying member method code with example usage: obj.best_split_suggestions(criterion, tree) and returns: best_suggestions, list