深度优先搜索(DFS)实现
interface TreeNode<T> {
name: string;
type: string;
children: TreeNode<T>[];
data: T;
}
function dfs<T>(root: TreeNode<T>, targetName: string): TreeNode<T> | null {
if (root.name === targetName) {
return root;
}
for (const child of root.children) {
const result = dfs(child, targetName);
if (result) {
return result;
}
}
return null;
}
广度优先搜索(BFS)实现
function bfs<T>(root: TreeNode<T>, targetName: string): TreeNode<T> | null {
const queue: TreeNode<T>[] = [root];
while (queue.length > 0) {
const node = queue.shift()!;
if (node.name === targetName) {
return node;
}
queue.push(...node.children);
}
return null;
}
使用泛型可能带来的性能问题
- 类型检查开销:泛型会增加编译时的类型检查工作,在复杂的树形结构中,每次访问节点和其属性时,编译器都需要检查类型的一致性,这可能导致编译时间变长。
- 代码膨胀:由于泛型在编译时会进行类型擦除,对于不同类型参数实例化的泛型代码,可能会生成重复的字节码,增加了代码体积。
优化建议
- 避免不必要的类型检查开销:
- 减少不必要的泛型参数:如果树形结构中的数据类型相对固定,可以减少泛型参数的使用,直接使用具体类型,从而减少编译时的类型检查。
- 使用类型断言:在确定类型的情况下,合理使用类型断言
as
,告诉编译器不需要对某些值进行额外的类型检查。例如,在已知某个节点一定是特定类型时,可进行断言。
- 利用类型信息进行代码优化重构:
- 静态类型分析工具:借助如ESLint的类型检查插件,在开发过程中提前发现类型相关的问题,优化代码结构,提高代码质量。
- 基于类型的函数重载:对于一些操作,根据不同的类型参数,提供不同的实现,以利用特定类型的特性进行优化。例如,对于特定类型的数据,可以有更高效的搜索逻辑。