2017-10-07 54 views
1
public void Print() { 
     Print(root, 4); 
    } 

    private void Print(Node node, int padding) { 
     if (node != null) { 
      if (node.rChild != null) { 
       Print(node.rChild, padding + 4); 
      } 
      if (padding > 0) { 
       Console.Write(" ".PadLeft(padding)); 
      } 
      if (node.rChild != null) { 
       Console.Write("/\n"); 
       Console.Write(" ".PadLeft(padding)); 
      } 
      Console.Write(node.value.ToString() + "\n "); 
      if (node.lChild != null) { 
       Console.Write(" ".PadLeft(padding) + "\\\n"); 
       Print(node.lChild, padding + 4); 
      } 
     } 
    } 

此代码在控制台中返回一个很好的格式日志。像下面一样使用嵌套方法的无效字符串方法转换

 6 
    /
    5 
    \ 
     4 
/
3 
\ 
    2 
    \ 
     2 

现在,当我将void转换为字符串格式时,它变得凌乱,它似乎不工作。因为我有嵌套的方法。

所以我现在失去了从虚空转换为字符串

+1

哪里是代码,您试过吗?如果您不显示我们,我们无法告诉您如何解决此问题。 – JLRishe

+0

它只是增加了一堆变量并在对方内返回并将void更改为String。我写的代码不在话题之列,理论上不应用 – Bamuel

回答

1

一个简洁的方式来处理,这将是:

  1. 替换每个if语句与条件语句,要么产生if陈述或空字符串里面的东西。
  2. 把所有的拼在一起使用+
  3. 返回结果

这将使你:

private string Print(Node node, int padding) 
{ 
    if (node != null) 
    { 
     return 
      (node.rChild != null 
       ? Print(node.rChild, padding + 4) 
       : "") + 
      (padding > 0 
       ? " ".PadLeft(padding) 
       : "") + 
      (node.rChild != null 
       ? "/\n" + " ".PadLeft(padding) 
       : "") + 
      node.value.ToString() + "\n " + 
      (node.lChild != null 
       ? " ".PadLeft(padding) + "\\\n" + Print(node.lChild, padding + 4) 
       : ""); 
    } 

    return ""; 
} 
2

所以不是打印出来的价值观,你想让它回到树为字符串。

好,要做到这一点,你只需要改变每Console.Write方法调用追加你被打印到大串的串,每Print方法调用的Print返回值追加到一个大的字符串。并在最后返回这个大字符串

基本上,想象“大字符串”是控制台。

您可以使用StringBuilder类作为我正在谈论的这个大字符串。让我们创建一个在印刷方法的开始:

StringBuilder sb = new StringBuilder(); 

现在我们需要寻找这两种模式,并改变它们。

我们改变:

Console.Write(XXX); 

sb.Append(XXX); 

,改变

Print(XXX, XXX); 

sb.Append(Print(XXX, XXX)) 

现在的方法是这样的:

private string Print(Node node, int padding) { 
    StringBuilder sb = new StringBuilder(); 
    if (node != null) { 
     if (node.rChild != null) { 
      sb.Append(Print(node.rChild, padding + 4)); 
     } 
     if (padding > 0) { 
      sb.Append(" ".PadLeft(padding)); 
     } 
     if (node.rChild != null) { 
      sb.Append("/\n"); 
      sb.Append(" ".PadLeft(padding)); 
     } 
     sb.Append(node.value.ToString() + "\n "); 
     if (node.lChild != null) { 
      sb.Append(" ".PadLeft(padding) + "\\\n"); 
      sb.Append(Print(node.lChild, padding + 4)); 
     } 
    } 
    return sb.ToString(); 
} 

在这之后,你应该能够改变参数的Print方法在自己的返回一个字符串。

相关问题