【问题标题】:How Recursion Works in Trees? [duplicate]递归如何在树中工作? [复制]
【发布时间】:2020-08-31 06:36:04
【问题描述】:

我正在遍历一棵树,想知道递归在 Trees 内部是如何工作的,因为代码看起来很简单,但是当我调试我的代码时,我很困惑它是如何工作的,因为我对 没有清楚的了解递归的工作,你能解释一下吗?看我的c#代码

public static void Traverse(Node root)
    {
       if (root == null) return;
       Console.WriteLine(root.data);

       Traverse(root.left);
       Traverse(root.right);
    }

【问题讨论】:

  • 将方法调用的状态/上下文视为一张纸。进行方法调用时,拿一张新纸并将其放在您已经拥有的堆栈的顶部。然后,在纸的顶部写下方法的所有参数及其值,然后在纸上为所有局部变量腾出空间。浏览该方法并根据需要调整纸上的变量。如果该方法调用另一个方法,请拿一张新纸并重复。当一个方法返回时,取出并丢弃它的一张纸。仔细考虑这个心理模型,看看是否有帮助。
  • 这能回答你的问题吗? Understanding recursion

标签: c# recursive-datastructures


【解决方案1】:

当我尝试用二叉树解决问题时,我发现它有助于准确跟踪某个节点何时进入和存在(何时将其推送到调用堆栈并从调用堆栈中弹出)。这类似于 Lasse V. Karlsen 的建议,但直接在代码中完成。您将用于任务的任何其他代码(例如交换左右子节点,收集所有访问节点的总和等)都必须发生在两个日志之间,并且可能应该有自己的日志,以便您可以看到您的错误可能发生在哪个节点上。例如:

static ArrayList results = new ArrayList();

public static void Traverse(Node root)
{
    if (root == null)
       return;

    Console.WriteLine("Entering", root.data);

    results.Add(root.data);
    Console.Write("Current Results: ");
    foreach(int i in results) {
        Console.Write(i + " ");
    }
    Console.WriteLine("");

    Traverse(root.left);
    Traverse(root.right);

    Console.WriteLine("Exiting", root.data);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 2014-04-17
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    相关资源
    最近更新 更多