【发布时间】:2018-06-04 13:01:16
【问题描述】:
我的 BST 插入方法有问题。它只是将我的姓名列表插入左侧,而不是向右递归并适当平衡。这就是我的输出的样子。此名称列表有 125 个名称,因此我将其缩短以适合此窗口。在输出下方,我为我的 BST java 程序的 insert 方法和 main 方法的一部分输入了我的 java 代码。我希望有人能看到我的问题,因为我和我的导师都找不到问题。
预购遍历: 沃尔特:空 |-劳伦斯:null |-肯:空 |-詹妮弗:空 |-大卫:空 |-沃尔特:空 |-菲尔:空 |-斯科蒂:null |-托德:空 |-伦纳德:null |-卡拉:null |-米歇尔:null |-吉尔:空 |-史蒂文:空 |-永利:空 |-劳埃德:空
public void insertLeft(E key, T value) {
Node<E, T> node = new Node<E, T>(key, value);
if (root == null) {
root = node;
} else {
Node current = root;
while (current.left != null) {
current = current.left;
}
current.left = node;
}
}
//User friendly THE ONLY THING THAT DOES NOT WORK!!!!!!!
public boolean insert(E key, T value) {
return insert(root, key, value);
}
public boolean insert(Node position, E key, T value) {
if (position == null) {
root = new Node<E, T>(key, value);
return true;
}
int comparison = position.key.compareTo(key);
if (comparison > 0) {
if (position.left == null) {;
position.left = new Node<E, T>(key, value);
return true;
}
return insert(position.left, key, value);
} else if (comparison < 0) {
if (position.right == null) {
position.right = new Node<E, T>(key, value);
return true;
}
return insert(position.right, key, value);
} else {
return false;
}
}
public static void main(String[] args) { Main main = new Main();
BinaryTree bst = new BinaryTree();
//ADD DATA Oshiro stuff
String namesList = "Walt Lawrence Ken Jennifer David Walter Phil Scotty "
+ "Todd Leonard Kara Michelle Jill Steven Wynn Lloyd Brandon Gary"
+ " Jim Dale Joyce Don Tom Christine Rachel Jeff Raymond Kelli"
+ " Charles Kevin Brant Joseph Michael Kelly Jessie Suzie Sally"
+ " Christian Terry John Art Francis Riki Evelyn Tony Ikaika Joe"
+ " Ann Neil Daniel Willie James Jeremy Aislynn Larry Celeste"
+ " Paige Dennis Fred Rosa Ryan George Gabe Lance Carolyn Mariah"
+ " Hal Christina Christopher Mark Stephen Stanley Sharon Hannah"
+ " Gregory Barry Kawika Greg Derek Philip Alfredo Jillian Joedie"
+ " Anthony Kyle Bradley Masa Clyde Robert Zachary Jaron Fernando"
+ " Kosuke Becky Dora Rheada Ashley Dustin Joshuah Ricardo Pete"
+ " Katrina Arwin Mica Arlene Venus Jenny Nicole Jeylyn Trisha"
+ " Theresa Eric Terry Trenton Marcus Tristan Rueben Melvin"
+ " Kurtis Mary";
//Use name for names and nameLength for number of names
String[] nameData = namesList.split("\\s");
boolean[] nameInsert = new boolean[nameData.length];
for (String dataAdd : nameData) {
bst.insertLeft(dataAdd, null);
}
System.out.println("\nThe Oshiro NamesList has been added to the tree, printing tree:");
bst.traverse(1);
System.out.println(bst.toString());
Scanner userInput = new Scanner(System.in);
System.out.println("Options available:"
+ "\n[0]Add the names to the tree"
+ "\n[1]Delete a name from the tree"
+ "\n[2]Print out contents of tree in alphabetical order"
+ "\n[3]Print out contents of tree in reverse alphabetical order"
+ "\n[4]Search the tree for a specific name and return number of probes"
+ "\n[5]Destroy the tree"
+ "\n[6]Balance the tree"
+ "\n[7]Draw the tree as loaded"
+ "\n[8]Draw the tree completely balanced"
+ "\n[9]Draw the tree"
+ "\n[10]Exit");
int selection;
【问题讨论】:
-
可能是因为你只使用了
insertLeft,它只在左边插入新节点,实际上根本没有排序。您是否尝试使用insertLeft制作排序树?如果是这样,这是一个名称不佳的函数 -
它应该按照字符串中列出的方式插入。在那之后我必须平衡它。 insertLeft 只是一个试验和错误的东西,看看我们是否可以让它进入。但是我们已经尝试过其他人,这个人终于进入了名单,但我们不知道除此之外还能做什么。我是做一个单独的 insertRight 还是可以单独使用 insert 方法?
-
在插入时排序更常见,而不是在之后尝试平衡树。你想做什么?
-
另请注意,平衡是插入时很痛苦的事情,而排序则不是。 Change binary search tree to balance
-
这是我项目要求的一部分。能够将每个名称添加到二叉树节点中——一次一个。按照二叉树插入的一般算法将每个节点放入树中。 (要使用的最少名称列表在下一页)。您可以让程序通过读取文件或通过硬代码加载名称。无论哪种情况,您都必须使用您设计的“添加”方法一次输入名称 1。名称将按照列出的确切顺序读入/添加。