java中二叉搜索树的级顺序遍历
我已经对我的二叉搜索树进行了4次不同的遍历。我被困在最后一个层次顺序遍历中,我似乎无法找到正确的方法 主要的问题是,我不知道如何一次只搜索一个级别,我只知道如何搜索整个左子树或整个右子树java中二叉搜索树的级顺序遍历,java,binary-search-tree,binaryfiles,tree-traversal,Java,Binary Search Tree,Binaryfiles,Tree Traversal,我已经对我的二叉搜索树进行了4次不同的遍历。我被困在最后一个层次顺序遍历中,我似乎无法找到正确的方法 主要的问题是,我不知道如何一次只搜索一个级别,我只知道如何搜索整个左子树或整个右子树 private void preOrder(BinaryNode<AnyType> t ) { if(isEmpty()){ System.out.println("Empty"); } if(t != null) {
private void preOrder(BinaryNode<AnyType> t )
{
if(isEmpty()){
System.out.println("Empty");
}
if(t != null) {
System.out.println(t.element);
preOrder(t.left);
preOrder(t.right);
}
}
private void postOrder(BinaryNode<AnyType> t){
if(isEmpty()){
System.out.println("Empty");
}
if (t != null) {
postOrder(t.left);
postOrder(t.right);
System.out.println(t.element);
}
}
private void inOrder(BinaryNode<AnyType> t)
{
if(isEmpty()){
System.out.println("Empty");
}
if (t != null) {
inOrder(t.left);
System.out.println(t.element);
inOrder(t.right);
}
}
private void levelOrder(BinaryNode<AnyType> t, int level)
{
if(isEmpty()){
System.out.println("Empty");
}
if(height(t) == 2) {
System.out.println(t.element);
}else if(height(t) > 1){
levelOrder(t.left, level );
levelOrder(t.right, level );
}
}
private void预订单(BinaryNode t)
{
if(isEmpty()){
System.out.println(“空”);
}
如果(t!=null){
系统输出打印LN(t元素);
前序(t.left);
前序(t.右);
}
}
专用无效邮政订单(BinaryNode t){
if(isEmpty()){
System.out.println(“空”);
}
如果(t!=null){
后序(t.left);
邮购(右);
系统输出打印LN(t元素);
}
}
私有void索引(二进制节点t)
{
if(isEmpty()){
System.out.println(“空”);
}
如果(t!=null){
顺序(t左);
系统输出打印LN(t元素);
顺序(t.右);
}
}
私有void levelOrder(二进制节点t,int级别)
{
if(isEmpty()){
System.out.println(“空”);
}
如果(高度(t)==2){
系统输出打印LN(t元素);
}否则(高度(t)>1){
水平顺序(t.左,水平);
levelOrder(t.右,level);
}
}
您的方法看起来像DFS方法,但可能不遵循该方法。
尝试在此处使用队列,它将帮助您正确遍历。
因为它将遵循BFS方法,所以您可以逐级遍历。
先添加左节点,然后添加右节点,并按照顺序进行操作。将整个搜索视为一系列“轮”,每个级别一个“轮” 在每一轮中:
- initialize a "next round" list of nodes to empty
- process a prepared list of nodes (the ones that are at that level and thus to be searched in that round) whereby for each node :
- do the actual comparison
- add all the node's child nodes to the "next round" list
使用仅填充根节点的“下一轮”列表启动流程
重复此操作,直到“下一轮”节点列表显示为空,或者您找到了要查找的节点。我就是这样做的
private void levelOrder(BinaryNode root) {
if (root == null) {
return;
}
Queue<BinaryNode> q = new LinkedList<>();
// Pushing root node into the queue.
q.add(root);
// Executing loop till queue becomes
// empty
while (!q.isEmpty()) {
BinaryNode curr = q.poll();
System.out.print(curr.element + " ");
// Pushing left child current node
if (curr.left != null) {
q.add(curr.left);
}
// Pushing right child current node
if (curr.right != null) {
q.add(curr.right);
}
}
}
private void levelOrder(二进制节点根){
if(root==null){
返回;
}
队列q=新的LinkedList();
//正在将根节点推送到队列中。
q、 添加(根);
//执行循环直到队列变为
//空的
而(!q.isEmpty()){
BinaryNode curr=q.poll();
系统输出打印(curr.element+“”);
//左推子节点当前节点
如果(当前左侧!=null){
q、 添加(当前左侧);
}
//正在推右子节点当前节点
如果(当前右侧!=null){
q、 添加(当前右侧);
}
}
}
请发帖。删除不相关的代码(像其他遍历一样),并添加运行它所需的内容。还包括测试数据。