2011-07-24 72 views
-1

我想遍历二叉搜索树与follwoing代码和我的递归只是照顾右侧如果树,我明白了为什么但我该怎么做才能改善这里的逻辑?遍历二叉搜索树

public void Print() { 
    Console.WriteLine(this.Value + " "); 
    if (this.Right != null) { 
     this.Right.Print(); 
    } 
    if (this.Left != null) { 
     this.Left.Print(); 
    } 
    Console.Read(); 
} 
+1

这里是否存在特定错误?另外,你为什么要在你的印刷品中阅读内容? – Jodaka

回答

1

这个问题,我认为,是你正在从控制台读取函数结束。当代码到达右侧树的底部时,它会执行Console.Read(),并且不会继续打印树的其余部分,直到获得某些内容。

消除这一点,它应该打印一切。

+0

我明白你在说什么,而你的建议实际上有效。对此感激不尽。但我有一个问题。我的console.Read实际上是在this.Left.Print();.那为什么是这种行为?第二个问题,这段代码产生了结果,那么这是什么样的遍历? Pre,Post或IN注册人? – TeaLeave

+0

思考发生了什么。您先递归调用右侧的Print()。当最终没有右或左孩子(发生在最右侧节点的底部,我接受它)时,它终于调用它的第一个“Read()”。如果你通过控制台输入了某些东西,那么它将返回,堆栈中的下一个“Print()”将重新获得控制权,并会再次尝试“Read()”(或左子树上的某个节点)。 –

+1

至于你的第二个问题,这是一个修改的预订。在打印子树之前打印节点值。它被修改是因为子树通常是从左到右访问的。 (我想如果你在一个国家,写一个从右到左的脚本,那么通常的方式将是“修改”版本。:-)) –