我有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);
}
}
}