C# 递归调用和对象在树中的迭代方式

C# 递归调用和对象在树中的迭代方式,c#,C#,我在学习oop的过程中偶然发现了这段代码,所以对我来说有点困惑。我正在实现二叉搜索树,这个特殊的函数实现顺序遍历 class Binary_Tree { //Nodes class Inner class. public class Nodes { public Nodes rightChild; public Nodes leftChild; public int value; publi

我在学习oop的过程中偶然发现了这段代码,所以对我来说有点困惑。我正在实现二叉搜索树,这个特殊的函数实现顺序遍历

 class Binary_Tree
{
    //Nodes class Inner class.
    public class Nodes
     {

         public Nodes rightChild;
         public Nodes leftChild;
         public  int value;

         public void InOrder()
          {
             if(leftChild != null)
                {
                  leftChild.InOrder();
                }

            Console.WriteLine(this.value);
            if(rightChild != null)
               {
                 rightChild.InOrder();
               }

           }

      }

    //Member of nodes class inside Binary tree class
    private Nodes root;

    //Default Constructor
    Binary_Tree() { }

    static void Main(string [] args)
    {

        Binary_Tree b = new Binary_Tree();
        b.Insertion(18);

        b.Insertion(10);
        b.Insertion(11);
        b.Insertion(5);
        b.Insertion(6);
        b.Insertion(3);
        b.root.InOrder();
        Console.WriteLine();

    }
}
我关心的是
leftChild.inoorder()
每次此函数调用自身时,它都会从一个
leftChild
移动到下一个
leftChild
。这怎么可能呢?因为我认为只有当出现类似于
leftChild=leftChild.leftChild
或者
leftChild=leftChild.next
这样的语句时,它才应该移动


提前谢谢

这是因为
leftChild
在被调用的方法中变成了
This
,而该方法又有自己的
leftChild
righchild


这里您可能错过的是,当您对引用调用实例方法时,引用在被调用的方法中变成
this

这是因为
leftChild
在被调用的方法中变成
this
,而被调用的方法又有自己的
leftChild
righchild


这里您可能遗漏的是,当您对引用调用实例方法时,引用在被调用的方法中变成了
this

您可以重写代码以显式显示“this”

公共类树 {


当您输入inoorder()时,当前对象是“this”。递归调用是在对象“this.leftChild”上进行的,该对象与“this”不是同一个对象(实际上它是子对象)。递归就是这样发生的。

您可以重写代码以显式显示“this”

公共类树 {


当您输入InOrder()时,当前对象是“this”。递归调用对象“this.leftChild”,它与“this”不是同一个对象(实际上它是子对象)。递归就是这样发生的。

在学习面向对象时,让我们看看这是否有帮助(我知道这不是严格意义上的事实,只是想在这里帮点忙)

在结构化环境中,您将执行以下操作:

void InOrder(Tree node){ ... }
然后像
inoorder(leftChild)
那样调用。这可以理解为:function
inoorder
,请使用
leftChild
作为
节点
参数运行自己

对于对象,您有:

class Tree{
    void InOrder(){ ... }
}
然后像
leftChild.inoorder()
那样调用。这可以理解为:object
leftChild
,请运行您的方法
inoorder

因此,您不需要执行类似于
leftChild=leftChild.leftChild
的操作,因为您告诉您的对象运行各自的方法,而不是使用不同参数运行的方法。也就是说,该方法运行多次,每次都使用不同的节点


请注意,在OO中,每个方法都包含在一个类中,这明确表示每个(非静态)方法都会接收该类型的参数,即
this
(我们要求运行该方法的对象)。

在学习面向对象时,让我们看看这是否有帮助(我知道这不是严格意义上的事实,只是想在这里帮点忙)

在结构化环境中,您将执行以下操作:

void InOrder(Tree node){ ... }
然后像
inoorder(leftChild)
那样调用。这可以理解为:function
inoorder
,请使用
leftChild
作为
节点
参数运行自己

对于对象,您有:

class Tree{
    void InOrder(){ ... }
}
然后像
leftChild.inoorder()
那样调用。这可以理解为:object
leftChild
,请运行您的方法
inoorder

因此,您不需要执行类似于
leftChild=leftChild.leftChild
的操作,因为您告诉您的对象运行各自的方法,而不是使用不同参数运行的方法。也就是说,该方法运行多次,每次都使用不同的节点


请注意,在OO中,每个方法都包含在一个类中,这意味着每个(非静态)方法都会收到该类型的参数,即
this
(我们要求运行该方法的对象).

@varocarbas:那里没有扩展方法。扩展方法是静态的。这段代码令人困惑。为了让我们能够完全理解它,您至少应该包含所有相关变量的声明。@WiktorZychla是的,我看到InOrder没有定义为扩展方法,但它如何与ith leftChild?因为leftChild和rightChild都是包含类?!这太奇怪了,而且在任何情况下都没有足够的信息。@Varocbas:它是在一个类中定义的,可能称为Tree,它有两个树类型的属性,leftChild和rightChild。@WiktorZychla OK。不完全确定这是唯一的选择,但是提供的信息和潜在的问题都很奇怪(因为OP还没有说一句话)实现。@varocabas:那里没有扩展方法。扩展方法是静态的。这段代码令人困惑。为了让我们能够完全理解它,您至少应该包含所有涉及的变量的声明。@WiktorZychla是的,我看到inoder没有定义为扩展方法,但它怎么可能是一个与leftChild关联?因为leftChild和rightChild都是包含类?!这太奇怪了,而且在任何情况下都没有足够的信息。@Varocbas:它是在一个类中定义的,可能称为Tree,该类有两个树类型的属性,leftChild和rightChild。@WiktorZychla OK。不完全确定这是唯一的选项对于提供的信息和潜在的(因为OP还没有说一句话)实现来说,这是一个非常有趣但非常奇怪的问题。显然你对OP的代码是完全正确的(我根本不喜欢使用这种递归)。但是OP没有选择这个答案?!无论如何…+1,因为你是第一个正确的答案:)谢谢你的验证。显然你对OP的代码是完全正确的(我不喜欢usi)