C# 递归调用和对象在树中的迭代方式
我在学习oop的过程中偶然发现了这段代码,所以对我来说有点困惑。我正在实现二叉搜索树,这个特殊的函数实现顺序遍历C# 递归调用和对象在树中的迭代方式,c#,C#,我在学习oop的过程中偶然发现了这段代码,所以对我来说有点困惑。我正在实现二叉搜索树,这个特殊的函数实现顺序遍历 class Binary_Tree { //Nodes class Inner class. public class Nodes { public Nodes rightChild; public Nodes leftChild; public int value; publi
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)
那样调用。这可以理解为:functioninoorder
,请使用leftChild
作为节点
参数运行自己
对于对象,您有:
class Tree{
void InOrder(){ ... }
}
然后像leftChild.inoorder()
那样调用。这可以理解为:objectleftChild
,请运行您的方法inoorder
因此,您不需要执行类似于leftChild=leftChild.leftChild
的操作,因为您告诉您的对象运行各自的方法,而不是使用不同参数运行的方法。也就是说,该方法运行多次,每次都使用不同的节点
请注意,在OO中,每个方法都包含在一个类中,这明确表示每个(非静态)方法都会接收该类型的参数,即
this
(我们要求运行该方法的对象)。在学习面向对象时,让我们看看这是否有帮助(我知道这不是严格意义上的事实,只是想在这里帮点忙)
在结构化环境中,您将执行以下操作:
void InOrder(Tree node){ ... }
然后像inoorder(leftChild)
那样调用。这可以理解为:functioninoorder
,请使用leftChild
作为节点
参数运行自己
对于对象,您有:
class Tree{
void InOrder(){ ... }
}
然后像leftChild.inoorder()
那样调用。这可以理解为:objectleftChild
,请运行您的方法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)