假定在一个树,即其根结点为A,有多个数目不定的子节点,如B C D E---.其中每个子节点又有数目不等的多个子节点,如B子节点有B1 B2 B3 B4--,C节点下有子节点C1 C2 C3 C4 C5---,以此类推.假定每个节点都包括字符串数据.假如有str1,str2,str3.要求与各层节点中的数据比较,寻找具备相应的字符串的节点,并打印其路径.
如A中如包括有str1,那么再在 B C D E--中寻找包涵 str2的节点,假定B C中存在str2,再在B C的子节点 B1 B2 B3 B4-- C1 C2 C4 C5 --查找包涵str3的子节点,假如B1 B4,C2 C4 C5中包涵str3.那么,打印出其路径
1.A B B1
2.A B B4
3.A C C2
4.A C C4
5.A C C5这个如果使用栈+递归的方法,我想我或许能够解决.但如果以广度优先+队列,怎样解决呢?一点思路都没有,请高手指点一下?
如A中如包括有str1,那么再在 B C D E--中寻找包涵 str2的节点,假定B C中存在str2,再在B C的子节点 B1 B2 B3 B4-- C1 C2 C4 C5 --查找包涵str3的子节点,假如B1 B4,C2 C4 C5中包涵str3.那么,打印出其路径
1.A B B1
2.A B B4
3.A C C2
4.A C C4
5.A C C5这个如果使用栈+递归的方法,我想我或许能够解决.但如果以广度优先+队列,怎样解决呢?一点思路都没有,请高手指点一下?
解决方案 »
- 不能以0,1,4,9,20、30、50、60、70、80、66634、6888和86等数字开头的正则表达式???
- 昨天去一家公司面试
- 比较大小
- 求助:如何用鼠标右键来选择JTable的一行或多行,并弹出菜单( 急....................................................................
- 有关swing中Table的问题?(求助)
- 关于JTextArea的问题
- 关于tomcat小问题
- 简单问题急盼大小侠
- JAVA有用于数据校验的类吗?象加密算法那样的.
- 攒了几天才凑够55分,都给了,一定要帮忙啊。
- 请教用JCreator做GUI设计的朋友。
- 我的socket客户端为什么收不到返回包? 急啊
@param 树节点
@param Vector中存放需要匹配的串
@param sb 反向的路径串
@return 当pipei式在当前结点已经完成匹配时返回true,当子pipei式在某个子为true且当前结点匹配的话,返回true,否则返回false;
boolean match(Tree t,Vector pipei,StringBuffer sb)
{
if(t.node.equals((String)pipei.remove(0)))
{
Tree [] childs=t.children();
if(pipei.size()==0)return true;
for(int i=0;i<childs.length;i++)
{
if(print(childs[i],pipei,sb))
{
sb.append(t.name);
return true;
}
}
}
return false;
}
由于楼主没有给出具体的建树的过程,这里给出自己的一个建树的过程。
只用了一个队列。
import java.util.*;
public class Main
{ public static void main(String [] args) throws Exception
{
int n=3;
String [] str={"1","2","3"};
Node A=new Node("1","A",null);
Node B=new Node("2","B",A);
Node C=new Node("2","C",A);
new Node("3","B1",B);
new Node("x","B2",B);
new Node("x","B3",B);
new Node("3","B4",B);
new Node("x","C1",C);
new Node("3","C2",C);
new Node("x","C3",C);
new Node("3","C4",C);
new Node("3","C5",C);
List<Node> queue=new LinkedList<Node>();
if(A.value.equals(str[A.level]))
queue.add(A);
while(queue.size()>0)
{
Node cur=queue.remove(0);
LinkedList<Node> children=cur.children;
for(int i=0;i<children.size();i++)
{
if(children.get(i).value.equals(str[cur.level+1]))
{
if(cur.level+1==n-1)
System.out.println(children.get(i).path);
else
{
children.get(i).level=cur.level+1;
queue.add(children.get(i));
}
}
}
}
}
}
class Node
{
public int level=0;
public String path="";
public LinkedList<Node> children=new LinkedList<Node>();
public String value="";
public String name="";
public Node(String val,String name,Node parent)
{
this.value=val;
this.name=name;
if(parent!=null)
{
parent.addChild(this);
path=parent.path+" "+name;
}
else
path=name;
}
public void addChild(Node child)
{
children.add(child);
}}
关于路径问题,楼主可以让每个节点拥有一个自己的序号和一个父节点的序号,
class Node{}
class Node{
int currentIndex;
int parentIndex;
}
找到目标节点后,沿着父节点序号向上一个一个顺藤摸瓜就可以知道路径了
int currentIndex;
int parentIndex;
}怎么搞法?