我只是有一个简单的实现查询。
所以我使用以下代码制作BST:
class Node{
int data;
Node left=null;
Node right=null;
Node link=null;
public Node(int d)
{
data=d;
}
public void append(int d)
{
Node n=this;
Node nval=new Node(d);
if(n==null)
{
n.data=d;
}
else
{ boolean done=false;
while(!done)
{
if(n.data<=d)
{
if(n.left==null)
{
n.left=nval;
done=true;
System.out.println("Data Entered "+nval.data);
}
else
{
n=n.left;
}
}
else
if(n.data>d)
{
if(n.right==null)
{
n.right=nval;
done=true;
System.out.println("Data Entered "+nval.data);
}
else
{
n=n.right;
}
}
}
}
}
}
现在,我开始先应用广度和深度优先搜索。这样做我遇到了真正的问题。
对于DFS,我必须添加放在堆栈上的当前节点的左右值吗?我该怎么编程呢?使用链接列表我遇到了这个问题?有人能告诉我数据结构或指针应该如何吗?
BFS也是如此。如果我以前不清楚,我的主要问题是删除一个数组元素,然后用它的子代替它。
答案 0 :(得分:2)
Queue(FIFO)通常适用于BFS。它不一定是优先级队列,但通常是因为赋予权重非常常见:
队列通常但不一定按FIFO(先进先出)的方式对元素进行排序。例外的是优先级队列,它根据提供的比较器对元素进行排序,或者元素的自然顺序,以及LIFO队列(或堆栈),它们对元素LIFO(后进先出)进行排序。无论使用什么顺序,队列的头部都是通过调用remove()或poll()来删除的元素。在FIFO队列中,所有新元素都插入队列的尾部。其他类型的队列可能使用不同的放置规则。每个Queue实现都必须指定其排序属性。
带有队列的BFS的基本“算法”规则:
Q
(队列)Q
(见remove
)parent -> [child1, child2 ..]
)Q
的尾部(请参阅add
)Q
为空或达到其他最终用例Arrays只是一个处理过去初始化和迭代的PITA。在Java中,“切片”和“调整大小”往往特别痛苦。
答案 1 :(得分:0)
对于DFS(FILO),你只需要使用一个堆栈
对于每个节点,首先将他的右孩子推到堆叠,然后推左孩子
对于BFS(FIFO),你应该使用队列作为@pst提到