""" @project:userbuild @File:treeClass.py @IDE:PyCharm @Author:徐彬程 @Date:2023/11/27 16:00 """ class PythonCodeTreeNode: def __init__(self, data, parent=None, last_node=None, indentation=0, serial_number=0, extent_data=None): if extent_data is None: extent_data = {} self.data = data self.parent = parent self.children = [] self.indentation = indentation self.extent_data = extent_data self.serial_number = serial_number self.last_node = last_node # 树结构类(非平衡非二叉树) class PythonCodeTreeController: # 增 @classmethod def add_data(cls, node): node.parent.children.append(node) # 删 @classmethod def del_data(cls): pass # 改 @classmethod def edit_data(cls): pass # 查 @classmethod def find_data(cls, root_node: PythonCodeTreeNode, i, s): if root_node.indentation == i and root_node.serial_number == s: return root_node for child in root_node.children: result = cls.find_data(child, i, s) if result: return result return None @classmethod def find_data_by_path(cls, root_node, path, depth=0): if root_node is None: return None components = path.split('/') current_node = root_node for component in components: if not component: # 跳过空的组件(例如,路径开头为 '/') continue found = False for child in current_node.children: if child.data["name"] == component: current_node = child found = True break if not found: return None # 如果未找到路径中的某个组件,返回None return current_node # 输出 @classmethod def to_array(cls, node): result = {} if not isinstance(node, str): result = node.data.copy() result["indentation"] = node.indentation result["serial_number"] = node.serial_number result["children"] = [cls.to_array(child) for child in node.children] return result # 输出 @classmethod def to_array2(cls, node): result = {} if not isinstance(node, str): result = node.data.copy() result["indentation"] = node.indentation result["serial_number"] = node.serial_number return result @classmethod def to_string(cls, code_json): # 输出当前节点的值 if not code_json['syntax_statement'] == 'Root': print(" " * (code_json["syntax_indentation"] - 4) + code_json['syntax_statement']) # 递归遍历子节点 for child in code_json['children']: cls.to_string(child)