了解递归打印二叉树的方法

本文关键字:方法 二叉树 打印 递归 了解 | 更新日期: 2023-09-27 18:14:06

我正在逐步执行这个YouTube教程中的代码,无法理解递归Print函数:

    public void Print(Node N, ref string s)
    {
        if (N == null) { N = top; }
        if (N.left != null)
        {
            Print(N.left, ref s);
            s = s + N.value.ToString().PadLeft(3);
        }
        else
        {
            s = s + N.value.ToString().PadLeft(3);
        }
        if (N.right != null)
        {
            Print(N.right, ref s);
        }
    }

我使用以下未排序数组来填充树:

int[] unsortedArray = new int[] {5, 17, 11, 24, 3, 18, 9};

我理解在通过Print方法的第一次传递中,top值等于5。然后程序进入第一个条件并执行这个递归调用

Print(N.left, ref s);

由于输入参数Node N现在是根的左节点,恰好是树中的最低值,因此它的左节点是null,因此程序下降到

下面的else条件
else
{
     `s = s + N.value.ToString().PadLeft(3);    
}

我迷路的地方是接下来发生的事情。在我看来,由于这个节点不包含右叶,程序将计算if(N.right !=null)条件,然后退出Print方法。

相反,代码计算if,然后跳到第一个条件下的Print(N.left, ref s);行:

        if (N.left != null)
        {
            Print(N.left, ref s);
            s = s + N.value.ToString().PadLeft(3);
        }

第一次真正深入研究递归。有人能告诉我为什么吗?

了解递归打印二叉树的方法

写完这篇文章后,答案变得很清楚了。程序跳转回

行的原因

Print(N.left, ref s);

是递归调用的起始位置。一旦输入参数Node N不再包含右节点,程序就退出该方法的迭代。也许有人能更好地解释这一点,所以我将离开这个帖子,没有选择答案。