Привет всем еще раз,
Мне было поручено напечатать мое двоичное дерево таким образом, чтобы мы должны были повернуть голову налево и посмотреть на него сбоку. Это будет иметь смысл, когда я предоставлю изображение.
Я не знаю, неверен ли мой метод вставки или мой метод showTree.
Вот мой InsertMethod:
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)
.
@rockyDodgers Нет проблем. Я добавил в ответ немного субъективной идеи по улучшению кода, возможно, это сделает его более читабельным :)