code: def _get_nodes_info(self):
      tree_nodes = {}
      children_left = {}
      children_right = {}
      node_index = 0
  
      def _walk_tree(node, node_id):
          nonlocal node_index
          tree_nodes[node_id] = node
          if node.get("split_index") is None:
              children_left[node_id] = -1
              children_right[node_id] = -1
              return
  
          node_index += 1
          children_left[node_id] = node_index
          _walk_tree(node.get("left_child"), node_index)
  
          node_index += 1
          children_right[node_id] = node_index
          _walk_tree(node.get("right_child"), node_index)
  
      def _convert_dict_to_list(my_dict):
          my_list = [-1] * len(my_dict)
          for key, value in my_dict.items():
              my_list[key] = value
          return my_list
  
      tree_dump = self.booster.dump_model()["tree_info"][
          self.tree_index
      ]
      _walk_tree(tree_dump["tree_structure"], node_index)
  
      for node in tree_nodes.values():
          node.pop("left_child", None)
          node.pop("right_child", None)
  
      children_left_list = _convert_dict_to_list(children_left)
      children_right_list = _convert_dict_to_list(children_right)
      tree_node_list = _convert_dict_to_list(tree_nodes)
  
      return tree_node_list, children_left_list, children_right_list
  
imports: from collections import defaultdict
  from typing import List, Mapping
  import numpy
  import pandas
  from lightgbm.basic import Booster
  from dtreeviz.models.shadow_decision_tree import ShadowDecTree, VisualisationNotYetSupportedError
  from dtreeviz import utils
label_desc: Use image node_id 2 for calling the ShadowLightGBMTree obj's underlying member method code with example usage: obj._get_nodes_info() and returns: tree_node_list,  children_left_list,  children_right_list, my_list