我有2节课。 ErdosStruct包含需要在SimpleTreeEx中进入JTree的所有数据。我正在努力的是编写递归的addNodes()以将erdosStruct中的节点添加到JTree。我对递归没有真正的理解,并建议伙伴们:
if it has no co authors
return
else
add the co authors
但我甚至不知道这意味着什么:(
你如何使用递归过度添加节点和子节点到树上?
import java.util.Vector;
/**
*
* @info The tree data structure. Each node in the tree is of type
* AuthNode. The root of the tree contains an AuthNode corresponding to
* "Root"
*/
public class ErdosStruct {
private AuthNode top = new AuthNode("Root");
public void createStruct() {
top.addCoAuth(new AuthNode("Node 0"));
top.addCoAuth(new AuthNode("Node 1"));
AuthNode coAuth = top.getCoAuth(0); // get Node 0
// Add to Node 0
coAuth.addCoAuth(new AuthNode("Node 00"));
coAuth.addCoAuth(new AuthNode("Node 01"));
coAuth = coAuth.getCoAuth(0); // get Node 00
coAuth.addCoAuth(new AuthNode("Node 000"));
coAuth = coAuth.getCoAuth(0); // get Node 000
// add to Node 000
coAuth.addCoAuth(new AuthNode("Node 0000"));
coAuth.addCoAuth(new AuthNode("Node 0001"));
coAuth.addCoAuth(new AuthNode("Node 0002"));
coAuth = coAuth.getCoAuth(2); // get Node 0002
AuthNode Node0002 = coAuth;
// add to Node 0002
coAuth.addCoAuth(new AuthNode("Node 00020"));
coAuth.addCoAuth(new AuthNode("Node 00021"));
coAuth.addCoAuth(new AuthNode("Node 00022"));
coAuth.addCoAuth(new AuthNode("Node 00023"));
coAuth.addCoAuth(new AuthNode("Node 00024"));
coAuth.addCoAuth(new AuthNode("Node 00025"));
/// Other Path
coAuth = top.getCoAuth(1); // get Node 1
coAuth.addCoAuth(new AuthNode("Node 10"));
coAuth = coAuth.getCoAuth(0);
coAuth.addCoAuth(new AuthNode("Node 100"));
coAuth = coAuth.getCoAuth(0);
coAuth.addCoAuth(new AuthNode("Node 1000"));
coAuth = coAuth.getCoAuth(0);
}
/**
* @return the root element of type AuthNode of the tree data structure
*/
public AuthNode getRoot() {
return top;
}
}
/**
* @info AuthNode structure and the interfaces
*/
class AuthNode {
/**
* Each AuthNode has a name and a vector of AuthNodes corresponding to co-authors
*/
private String name;
private Vector<AuthNode> coAuths = new Vector<AuthNode>();
/**
* Two types of constructor
*/
public AuthNode() {
}
public AuthNode(String n) {
name = n;
}
// Self-explanatory interfaces
public void setName(String n) {
name = n;
}
public String getName() {
return name;
}
// Understand the usage of toString
public String toString() {
return name;
}
public int getCoAuthCount() {
return coAuths.size();
}
public void addCoAuth(AuthNode coAuthor) {
coAuths.addElement(coAuthor);
}
public AuthNode getCoAuth(int i) {
return (AuthNode) coAuths.get(i);
}
}
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreeNode;
/**
*
* @info Main window of the UI - mainFrame of type JFrame contains ErdosStructurePanel of type JPanel
*/
public class SimpleTreeEx extends JFrame {
public static void main(String[] args) {
/**
* erdosStruct contains a tree where node of the tree represents a
* computer scientist - there is an edge from one node to another if the
* computer scientists associated to these nodes have co-authored a
* scientific article (See createStruct method in ErdosStruct class for
* details)
*/
ErdosStruct erdosStruct = new ErdosStruct();
erdosStruct.createStruct();
SimpleTreeEx mainFrame = new SimpleTreeEx();
/**
* ErdosStructPanel constructor takes a parameter of type ErdosStruct
*/
mainFrame.getContentPane().add(new ErdosStructPanel(erdosStruct));
mainFrame.setSize(500, 500);
mainFrame.setVisible(true);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
class ErdosStructPanel extends JPanel {
/**
* @info contains the tree data structure with information on co-authorship relations
*/
public ErdosStructPanel(ErdosStruct erdosStruct) {
DefaultMutableTreeNode root = new DefaultMutableTreeNode(erdosStruct.getRoot());
DefaultTreeModel tModel = new DefaultTreeModel(root);
JTree tree = new JTree(tModel);
tree.setShowsRootHandles(true);
JScrollPane scroll = new JScrollPane(tree);
add(scroll, BorderLayout.CENTER);
}
private void addNodes(ErdosStruct erdosStruct, DefaultTreeModel tModel) {
if (erdosStruct.getRoot().getCoAuthCount() == 0) {
return;
} else {
erdosStruct.getRoot().getCoAuth(0)
tModel.insertNodeInto(new DefaultMutableTreeNode(), (MutableTreeNode) tModel.getRoot(), 0);
}
}
}
答案 0 :(得分:1)
private void addNodes(ErdosStruct erdosStruct, DefaultTreeModel tModel) {
if (erdosStruct.getRoot().getCoAuthCount() == 0) {
return;
} else {
AuthNode node = erdosStruct.getRoot();
addNodes(node, tModel, (MutableTreeNode) tModel.getRoot());
}
}
protected void addNodes(AuthNode node, DefaultTreeModel tModel, MutableTreeNode parent) {
if (node != null) {
MutableTreeNode newParent = new DefaultMutableTreeNode(node);
tModel.insertNodeInto(newParent, parent, parent.getChildCount() - 1);
for (int index = 0; index < node.getCoAuthCount(); index++) {
AuthNode child = node.getCoAuth(index);
addNodes(child, tModel, newParent);
}
}
}
好的,那真是太痛苦了。这是一种“可能”的解决方案。就个人而言,我更喜欢直接将一个孩子添加到父母,而不是将其传递给要添加的方法,但是头部疼痛