Xamarin Forms树形层级结构中节点查找递归函数优化方案求助
解决Xamarin Forms树形节点递归查找的问题
哈哈,这个问题我之前也踩过坑!你的递归函数核心问题是过早返回——当当前节点不匹配时,你直接递归它的子节点并返回结果,导致当前层级的其他兄弟节点完全没机会被遍历检查。
问题根源分析
原来的代码里,当a.Id != id且a.Items.Count > 0时,你直接return GetA(id, a.Items),这意味着只要第一个子节点分支没找到目标,就直接返回null,不会继续看同一层的下一个节点。这就是为什么只能遍历每个节点的第一个子节点的原因。
修正后的递归实现
我们需要调整逻辑:递归查找子节点时,先接收结果,如果结果不为null再返回,否则继续遍历当前层级的其他兄弟节点。同时加上null判断避免空引用异常:
private A GetA(string id, List<A> items) { // 先处理传入的items为null的情况 if (items == null || items.Count == 0) return null; foreach (var a in items) { // 优先检查当前节点是否匹配 if (a.Id == id) { return a; } // 递归查找当前节点的子节点 var foundChild = GetA(id, a.Items); // 如果子节点中找到了目标,直接返回 if (foundChild != null) { return foundChild; } // 如果当前节点和子节点都没找到,自动遍历下一个兄弟节点 } // 所有节点遍历完毕未找到 return null; }
可选:迭代式遍历(避免栈溢出)
如果你的树形结构特别深,递归可能会触发栈溢出,这时候可以用迭代的方式实现广度优先遍历(或者深度优先):
private A GetAIterative(string id, List<A> rootItems) { if (rootItems == null || rootItems.Count == 0) return null; // 用队列实现广度优先遍历 var nodeQueue = new Queue<A>(rootItems); while (nodeQueue.Count > 0) { var currentNode = nodeQueue.Dequeue(); if (currentNode.Id == id) { return currentNode; } // 将子节点加入队列(如果存在) if (currentNode.Items != null) { foreach (var child in currentNode.Items) { nodeQueue.Enqueue(child); } } } return null; }
额外优化建议
- 可以给
A类添加一个扩展方法,把查找逻辑封装起来,提高代码复用性:public static class AExtensions { public static A FindById(this List<A> items, string id) { // 这里放入上面的递归或迭代逻辑 } } - 如果需要频繁查找,可以提前把所有节点存入一个
Dictionary<string, A>,用O(1)的时间复杂度查找,初始化的时候遍历一次树形结构即可。
内容的提问来源于stack exchange,提问作者fcd9
相关产品推荐
相关产品推荐

