繁体   English   中英

寻找节点的路径 - 具有多个子节点的树

[英]Finding Path to a Node - Tree with multiple children

我一直在挠头寻找解决这个问题的方法。 我对数据结构不是很好,每当我必须对树做任何事情时,我的大脑似乎都会融化一点。

假设我们有一个 Node():

Node(name: String, children: List<Node>?)

我们有一棵由这些节点组成的树:

var node6 = Node("6", null)
var node5 = Node("5", null)
var node4 = Node("4", null)
var node3 = Node("3", listOf(node5, node6))
var node2 = Node("2", null)
var node1 = Node("1", listOf(node2, node3, node4))

我可以采取什么方法来找到 node6 的路径(存储),而只有 root 可用?

非常感谢您提供的任何建议!


根据JayC667的指导解决方案:

fun recursiveCheck(
    nodeA: Node,
    nodePath: Stack<Node>,
    nodeToFind: String
) : Boolean {
    // Push param node to stack
    nodePath.push(nodeA)

    // Check param node
    if(nodeA.name == nodeToFind) {
        return true
    }

    if(nodeA.children != null) {
        // Iterate over all children using recursive check
        for(child in nodeA.children!!) {
            // child found as param node
            if(recursiveCheck(child, nodePath, nodeToFind)) return true
        }
    }

    // Did not find node, popping off stack
    nodePath.pop()
    return false
}

简单的。 当然,如果节点在树中只存在一次并且可以从根访问。

使用 Stack 作为节点路径堆栈:

  1. 启动方法:创建栈,调用递归校验方法,参数:(根节点,节点路径栈,要查找的节点)
  2. 递归检查方法:将参数节点推入堆栈,检查参数节点,遍历所有子节点+为每个子节点调用递归检查方法 如果发现 child 作为参数节点或在子调用中,立即返回 true(并返回)
  3. 每次离开递归检查方法时(最后,如果您还没有找到节点),将当前元素从堆栈中弹出。
  4. 如果在启动方法递归检查方法返回 true,则您的节点路径将位于堆栈上

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM