通过倾斜你的头来打印二叉树

Print Binary Tree By Tilting Your Head

再次向大家问好,

我被指派以一种我们应该将头转向左侧并从侧面看它的方式打印我的二叉树 - 当我提供图像时它会有意义。

不知道是我的Insert方法还是showTree方法错了

这是我的插入方法:

public void insert(Keyed item)
   {
      _root = insert(_root, item);
   }
   
   private TNode insert (TNode myRoot,Keyed item)
   {
      if(myRoot == null)
      {
         TNode newNode = new TNode();
         newNode.data = item;
         newNode.left = null;
         newNode.right = null;
         return newNode;
      }
      
      int comp = item.KeyComp(myRoot.data);
      
      if(comp < 0)
      {
         myRoot.left = insert(myRoot.left, item);
      }
      else if (comp > 0)
      {
         myRoot.right = insert(myRoot.right, item);
      }
      return myRoot;   
   }
   

这是我的 showTree 方法:

public void showTree()
   {
      showTree(_root,1);  
   }
   
   private void showTree(TNode myRoot,int myLevel)
   {
      if(myRoot == null) 
      {
         return;
      }
      
      for(int i = 0; i < myLevel; i++)
      {
         System.out.print("\t");
         
      }  
      showTree(myRoot.right, myLevel + 1);
      System.out.println(myRoot.data.toStr());
      showTree(myRoot.left, myLevel + 1);      
   }

如果需要任何其他方法来提供帮助 - 我可以提交它,但老实说我不知道​​我的插入方法是否没有正确执行某些操作,或者我的 ShowTree 方法是否没有间隔我的二进制文件树正确。

非常感谢您的帮助!

谢谢!

在打印当前节点的缩进之前尝试打印正确的节点。像这样:

private void showTree(TNode myRoot,int myLevel)
{
  if(myRoot == null) 
  {
     return;
  }
  
  showTree(myRoot.right, myLevel + 1);
  for(int i = 0; i < myLevel; i++)
  {
     System.out.print("\t");
     
  }
  System.out.println(myRoot.data.toStr());
  showTree(myRoot.left, myLevel + 1);      
}

另外我认为你应该从 0 级开始,调用 showTree(_root,0);

我个人认为如果将缩进合并为一个字符串然后打印出来会更易读。像这样:

private void showTree(TNode myRoot,int myLevel)
{
  if(myRoot == null) 
  {
     return;
  }
  
  String currentNodeIdentation = "";
  for(int i = 0; i < myLevel; i++)
  {
     currentNodeIdentation += "\t";
  }
  
  showTree(myRoot.right, myLevel + 1);
  System.out.println(currentNodeIdentation + myRoot.data.toStr());
  showTree(myRoot.left, myLevel + 1);      
}

或者如果你有 java 11 你甚至可以使用 currentNodeIdentation = "\t".repeat(myLevel).