Java:一种搜索节点树结构的算法
我正在用java编写一个“家谱”程序,我很难理解搜索节点的算法 节点由名称、到伙伴的链接、兄弟节点、子节点和整数标识符组成 我尝试的算法只是走到了死胡同,如果能朝着正确的方向推动一下,我将不胜感激Java:一种搜索节点树结构的算法,java,algorithm,search,tree,Java,Algorithm,Search,Tree,我正在用java编写一个“家谱”程序,我很难理解搜索节点的算法 节点由名称、到伙伴的链接、兄弟节点、子节点和整数标识符组成 我尝试的算法只是走到了死胡同,如果能朝着正确的方向推动一下,我将不胜感激 基本上,每个节点都有一个数字标识符,我希望能够让用户输入一个数字,搜索树中的每个节点,并插入一个节点作为匹配节点的子节点、兄弟节点或伙伴节点。 树结构示例: 注意,由于这是一项作业,我无法更改结构 假设所有标识符都是唯一的,您可以使用任何树遍历算法来实现搜索。这是一个可以解决您的问题的DFS示例(您可
基本上,每个节点都有一个数字标识符,我希望能够让用户输入一个数字,搜索树中的每个节点,并插入一个节点作为匹配节点的子节点、兄弟节点或伙伴节点。 树结构示例: 注意,由于这是一项作业,我无法更改结构
假设所有标识符都是唯一的,您可以使用任何树遍历算法来实现搜索。这是一个可以解决您的问题的DFS示例(您可以根据需要修改此函数)
注意:您描述的图形只是“几乎”一棵树;总是有夫妻和兄弟姐妹形成的循环。而且,我不明白你真正的问题是什么;是否只想遍历族图?您想要遍历的某种顺序吗?你想根据某个谓词对其进行“排序”吗?基本上,每个节点都有一个数字标识符,我想让用户输入一个数字,搜索树中的每个节点,并插入一个节点作为匹配节点的子节点、兄弟节点或伙伴。你可以使用哈希将标识符映射到节点,或者您可以使用图遍历(BFS/DFS)搜索节点。一个问题是您将要遇到的问题是,您正在设置树,以便只允许节点有一个子节点。您可能需要考虑使用ARARYLIST来保存需要的多个孩子。这也使您可以更轻松地搜索孩子。这里有一个指向二叉树的链接,您可以将其修改为完整树。谢谢你的回复,但由于这是作业的一部分,我不能改变结构。
Alice[2] <--partner-- John[1]
|
Ted[3] --sibling--> Eric[4] --sibling--> Joanne[5]
|
Joe[6] --sibling--> Bret[7]
public class FamilyTree {
private class FamilyTreeNode{
private int identifier ;
private String Name ;
private FamilyTreeNode partner;
private FamilyTreeNode sibling;
private FamilyTreeNode child;
}
private FamilyTreeNode ancestor;
private FamilyTreeNode currentNode ;
private int indexNumber = 1;
public FamilyTree(){
this.ancestor = new FamilyTreeNode();
this.ancestor.Name = Input.getString("Enter ancestors Name: ");
this.ancestor.identifier = 0;
}
public FamilyTreeNode addChild(){
//Set up variables and create new node
currentNode = ancestor;
boolean matchFound = false ;
FamilyTreeNode newFamilyNode = new FamilyTreeNode() ;
newFamilyNode.Name = Input.getString("Enter Name");
//
//Checking for existing Name
if(currentNode.child != null){
currentNode = currentNode.child;
if(currentNode.Name.compareToIgnoreCase(newFamilyNode.Name) == 0){
matchFound = true;
}
while(currentNode.sibling != null){
currentNode = currentNode.sibling;
if(currentNode.Name.compareToIgnoreCase(newFamilyNode.Name) == 0){
matchFound = true;
}
}
}
//
//Check for existing siblings, add to end of list
currentNode = ancestor;
if(currentNode.child == null){
newFamilyNode.identifier = indexNumber;
currentNode.child = newFamilyNode ;
}else{
currentNode = currentNode.child;
while (currentNode.sibling != null){
currentNode = currentNode.sibling;}
if(matchFound == false){
indexNumber++;
newFamilyNode.identifier = indexNumber;
currentNode.sibling = newFamilyNode;
}
else{
System.out.println("Name already exists");
}
}
//
return newFamilyNode ;
}
public FamilyTreeNode addPartner(){
currentNode = ancestor ;
FamilyTreeNode newPartnerNode = new FamilyTreeNode() ;
int currentNodeIdentifier;
int partnerIdentifier;
boolean insertPointFound = false ;
display();
partnerIdentifier = Input.getInteger("Input partner ID");
while(insertPointFound == false){
if(partnerIdentifier == currentNode.identifier){
}else{
currentNode
}
}
return newPartnerNode;
}
public void display(){
currentNode = ancestor;
System.out.println(currentNode.Name + " " + currentNode.identifier);
if(currentNode.child != null){
currentNode = currentNode.child;
System.out.println(currentNode.Name + " " + currentNode.identifier);
while(currentNode.sibling != null){
currentNode = currentNode.sibling;
System.out.println(currentNode.Name + " " + currentNode.identifier);
}
}
}
}
boolean[] visited = new boolean[n]; // n is no. of nodes in the tree
public FamilyTreeNode dfs(FamilyTreeNode root, int searchKey) {
if(root == null) {
return null;
}
if(root.identifier == searchKey) {
return root;
}
visited[root.identifier] = true;
FamilyTreeNode next = null;
if((root.partner != null) && (!visited[root.partner.identifier])) {
next = dfs(root.partner, searchKey);
}
if(next != null) return next;
if((root.sibling != null) && (!visited[root.sibling.identifier])) {
next = dfs(root.sibling, searchKey);
}
if(next != null) return next;
if((root.child != null) && (!visited[root.child.identifier])) {
next = dfs(root.child, searchKey);
}
return next;
}