当前位置: 首页 > 知识库问答 >
问题:

BST级顺序遍历

广绪
2023-03-14

我想在级别顺序遍历中打印出BST。但是我以这种奇怪的方式得到了输出。此外,我使用Java可视化工具来检查我的算法,没有线索,因为可视化工具没有说明多个实例。我在想,要么我的变量tmp没有正确地添加到我的ArrayList实例set中,要么set没有添加到ArrayList中

import java.util.LinkedList;
import java.util.Queue;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Arrays;

public class BSTordertraversal{

  public static class TreeNode{
    int value;
    TreeNode left;
    TreeNode right;
    public TreeNode(int value){
      this.value=value;
    }
  }
  public static ArrayList<ArrayList<Integer>> levelOrder(TreeNode root){
    HashMap<TreeNode,Integer> map = new HashMap<>();
    Queue<TreeNode> queue = new LinkedList<TreeNode>();
    ArrayList<Integer> set = new ArrayList<>();
    ArrayList<ArrayList<Integer>> solution = new ArrayList<ArrayList<Integer>>();
    queue.add(root);
    int lastlvl = 0;
    map.put(root,0);
    if(root==null){
      return solution;
    }
    int tmp;
    while(queue.peek()!=null){
      TreeNode current = queue.peek();
      if(current.left!=null){
        queue.add(current.left);
        map.put(current.left, map.get(current)+1);
      }
      if(current.right!=null){
        queue.add(current.right);
        map.put(current.right, map.get(current)+1);
      }
      if(map.get(current)==lastlvl){
        tmp = current.value;
        set.add(tmp);
        queue.remove();
      }else if(map.get(current)>lastlvl){
        solution.add(set);
        set.clear();
        tmp = current.value;
        set.add(tmp);
        lastlvl=map.get(current);
        queue.remove();
      }
    }
    return solution;
  }

  public static void main(String[] args) {
    TreeNode root = new TreeNode(3);
    root.left = new TreeNode(9);
    root.right = new TreeNode(20);
    //root.left.left = new TreeNode(null);
    //root.left.right= new TreeNode(null);
    root.right.left = new TreeNode(15);
    root.right.right= new TreeNode(7);
    //root.right.right.right = new TreeNode(30);
    ArrayList<ArrayList<Integer>> solution = levelOrder(root);
    System.out.println("[");
    for(int i=0;i<solution.size();i++){
      System.out.print("[");
      for(int x=0;x<solution.get(i).size();x++){
        System.out.print(solution.get(i).get(x));
      }
      System.out.print("]");
    }
    System.out.println("");
    System.out.println("]");
  }
}

以下是输出:


共有1个答案

濮阳繁
2023-03-14

我略微改变你的函数level为:

 public static ArrayList<Integer> levelOrder(TreeNode root){
        Queue<TreeNode> queue=new LinkedList<TreeNode>();
        ArrayList<Integer> levelOrderData =  new ArrayList<>();
        queue.add(root);
        while(!queue.isEmpty())
        {
            TreeNode tempNode=queue.poll();
            levelOrderData.add(tempNode.value);
            if(tempNode.left!=null)
                queue.add(tempNode.left);
            if(tempNode.right!=null)
                queue.add(tempNode.right);
        }
        return levelOrderData;
  }

这是不必要的:

  ArrayList<ArrayList<Integer>> solution = new ArrayList<ArrayList<Integer>>();
 类似资料:
  • 上下文:我在Java中创建了一个BinarySearchTree类作为学习练习,因为我是Java新手。我目前正在为级别顺序遍历(BFS)编写一个方法,该方法返回每个级别的节点值列表,其中顶级列表索引表示级别编号,每个索引处的较低级别列表包含该级别的节点值,例如此树的节点值 levelOrder()方法将返回 问题:在实现中,我声明了一个名为“listOfLevels”的顶级列表来保存级别列表,以及

  • 二叉树的预序遍历是{8,5,9,7,1,12,4,11,3},其顺序是{9,5,1,7,12,8,4,3,11}。用它构造二叉树并执行级别顺序遍历。最后构造一个二叉搜索树(BST),从左到右依次获取在上述级别顺序遍历中出现的键值。这个BST的级别顺序遍历是什么?

  • 我正在尝试对二叉树进行级别顺序遍历。但诀窍是代替正常的级别顺序遍历,我想做另一种选择。对于例如。 普通等级顺序遍历 : 我要找的是我们打印根。现在,对于每一个偶数级,我都想逆时针旋转,对于每奇数级,都会顺时针旋转: 对于这种遍历,输出应该是: 这是我到目前为止尝试的,但这产生的输出与我试图实现的输出略有不同: 该程序产生以下输出: < code>1 3 2 5 4 7 6 10 11 9 8 我需

  • 我想逐级显示树结构。我当前的代码执行BFS或级别顺序遍历,但我无法使输出像树一样显示树结构。请参阅当前输出和预期输出。 我的想法是使用某种计数来迭代队列中同一级别的元素。 我怎么能这样做呢。 没有此功能的原始代码可以在下面的链接中找到,以防有人需要整个实现,否则只需查看下面的显示BFS功能。 java中泛型树(n元树)的级顺序遍历 谢谢 另外,我之前发布了一个具有相同功能的逻辑问题,因为已经回答了

  • 这是一个leetcode问题。 给定一个二叉树,返回其节点值的级序遍历(即从左到右,逐级)。 例如:给定二叉树, 将其级别顺序遍历返回为: 但我正在用JavaScript尝试一种新的方式,而不是完全按照他们的解决方案。到目前为止,我能够打印阵列,但 如何在新行中打印不同的级别 以下是我目前的代码: 输入:[3,9,20,空,空,15,7], LeetCode问题链接:BinarytreeTrave

  • (为了避免冗长的解释,我所要寻找的只是java中泛型树(n元树)的级别顺序遍历。提供的代码正常工作,需要级别顺序显示功能。环顾四周一个小时,但找不到通用n元树的参考。如果soemone能帮助我在代码上构建LevelOrderDisplay函数,我将不胜感激,因为它将帮助我理解我遇到的队列错误。谢谢 我一直在尝试在工作中实现Autosys作业计划的树表示。由于每个作业(流程)可以有一个或多个依赖作业