C# 不使用集合类实现BST并按类别列出条目的相关问题
二叉搜索树(BST)按类型罗列功能实现方案
该需求完全可以实现,以下是具体实现思路和代码示例,全程不使用任何集合类,适配控制台应用场景:
实现逻辑说明
目前你的BST是按toolName字段排序的主树,按类型筛选有两种可选实现路径:
- 全树遍历筛选:直接对整个BST做中序遍历(保证输出结果仍按toolName排序),遍历过程中判断当前节点的类型字段是否和用户输入的目标类型匹配,匹配则输出。该方案实现简单,不需要额外存储结构,适合数据量不大的场景。
- 类型子树索引:如果数据量较大,不想每次查询都扫描全树,可以自定义一个类型索引链表,每个链表节点存储类型名称和对应类型的BST子树根节点。每次往主BST插入数据时,同步将节点插入对应类型的子BST中,子BST同样按
toolName排序。查询时直接取出对应类型的子BST做中序遍历即可,查询效率更高。
核心代码示例(Java实现,其他语言逻辑通用)
// BST节点定义 class ToolNode { String toolName; String type; // 可自行扩展价格、库存等其他字段 ToolNode left; ToolNode right; public ToolNode(String toolName, String type) { this.toolName = toolName; this.type = type; this.left = this.right = null; } } // 按toolName排序的BST实现 class ToolBST { private ToolNode root; // 节点插入方法 public void insert(ToolNode newNode) { root = insertRecursive(root, newNode); } private ToolNode insertRecursive(ToolNode current, ToolNode newNode) { if (current == null) { return newNode; } // 按toolName字典序比较排序,不区分大小写 int compareResult = newNode.toolName.compareToIgnoreCase(current.toolName); if (compareResult < 0) { current.left = insertRecursive(current.left, newNode); } else if (compareResult > 0) { current.right = insertRecursive(current.right, newNode); } // 重复toolName可自行处理,示例中直接忽略 return current; } // 选项1:中序遍历输出所有工具,默认按toolName排序 public void listAllTools() { System.out.println("===== 全部工具列表 ====="); inOrderTraverse(root); } private void inOrderTraverse(ToolNode node) { if (node != null) { inOrderTraverse(node.left); System.out.printf("工具名:%s,类型:%s%n", node.toolName, node.type); inOrderTraverse(node.right); } } // 按类型罗列工具功能,采用全树遍历筛选方案实现 public void listByType(String targetType) { System.out.printf("===== 类型为「%s」的工具列表 =====%n", targetType); filterByType(root, targetType); } private void filterByType(ToolNode node, String targetType) { if (node != null) { filterByType(node.left, targetType); // 类型匹配则输出,不区分大小写 if (node.type.equalsIgnoreCase(targetType)) { System.out.printf("工具名:%s,类型:%s%n", node.toolName, node.type); } filterByType(node.right, targetType); } } }
控制台菜单逻辑示例
import java.util.Scanner; public class BSTConsoleApp { public static void main(String[] args) { ToolBST bst = new ToolBST(); // 初始化插入样本数据 bst.insert(new ToolNode("羊角锤", "手动工具")); bst.insert(new ToolNode("充电电钻", "电动工具")); bst.insert(new ToolNode("活动扳手", "手动工具")); bst.insert(new ToolNode("切割机", "电动工具")); bst.insert(new ToolNode("螺丝刀", "手动工具")); Scanner scanner = new Scanner(System.in); while (true) { System.out.println("\n===== 工具管理系统 ====="); System.out.println("1. 罗列所有工具(按名称排序)"); System.out.println("2. 按类型罗列工具"); System.out.println("3. 退出系统"); System.out.print("请输入操作选项:"); int choice = scanner.nextInt(); scanner.nextLine(); // 处理换行符 switch (choice) { case 1: bst.listAllTools(); break; case 2: System.out.print("请输入要查询的工具类型:"); String type = scanner.nextLine(); bst.listByType(type); break; case 3: System.out.println("已退出系统"); scanner.close(); return; default: System.out.println("无效选项,请重新输入"); } } } }
内容的提问来源于stack exchange,提问作者EdNS
相关产品推荐
相关产品推荐

