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

为什么在级别顺序树遍历过程中返回2D列表中的重复项?

逄嘉禧
2023-03-14

这是leetcode问题#102。这个问题的leetcode描述是:给定一个二叉树,返回其节点值的级别顺序遍历。(即,从左到右,逐级)。

所以给一棵像树一样的树

    3
   / \
  9  20
    /  \
   15   7

应该返回

[
  [3],
  [9,20],
  [15,7]
]

我的代码在下面

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        if(root == null) return new ArrayList<List<Integer>>();
        Queue<TreeNode> list = new LinkedList<TreeNode>();
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        list.add(root);

        while(!list.isEmpty()){
            int size = list.size();
            List<Integer> temp = new ArrayList<Integer>();

            while(size != 0){

                root = list.remove();

                if(root.left != null)  list.add(root.left);
                if(root.right != null) list.add(root.right);

                temp.add(root.val);

                size--;
                res.add(temp);
            }
        }
        return res;   
    }
}

为什么当我在第二个while循环中离开res.add(temp)时,它返回的答案是:[[3],[9,20],[9,20],[15,7],[15,7]]

但是当我把res.add(temp)放在第二个while循环的外部,而放在第一个while循环的内部时,我得到了正确的答案。另外,如果这篇文章的格式很糟糕,或者如果我写这篇文章的时间比我应该写的要长很多,我也很抱歉,因为我还没有在stackoverflow上发布问题。非常感谢。

共有1个答案

郗亦
2023-03-14

因为第一个循环通过级别(级别是list的当前内容):

    3            one list for level 0: [3]
   / \           
  9  20          one list for level 1: [9, 20]
    /  \
   15   7        one list for level 2: [15, 7]  

第二个循环通过每个级别上的节点(root是当前节点):

    3            one list for "3": [3]
   / \           
  9  20          one list for "9" [9, 20], the same list for "20": [9, 20]
    /  \
   15   7        one list for "15" [15, 7], the same list for "7" [15, 7]  

您可以输出listroot的当前值,以帮助您可视化算法:

while(!list.isEmpty()){
    System.out.println("First loop. Current level: "+list);
    int size = list.size();
    List<Integer> temp = new ArrayList<Integer>();
    while(size != 0) {
        root = list.remove();
        System.out.println("Second loop. Current node: "+root);

        if(root.left != null)  list.add(root.left);
        if(root.right != null) list.add(root.right);

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

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

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

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

  • 我正在尝试对二叉搜索树进行一次级别顺序遍历,并在多维数组中返回最终结果。例如,如果根节点是,而级别1的节点是,那么它应该从代码返回作为。我是数据结构方面的新手,也没有使用函数的命令。任何帮助都将不胜感激。谢谢:)

  • 我必须创建两个类:NonBinaryTree和SingleNode类,包含一些处理节点和整个树的方法(在NonBinaryTree类中)。我在使用队列(先进先出类型)实现非二叉树的BFS(层次顺序)遍历时遇到过问题。由于二叉树有很多资源,每个节点最多有两个子节点,我还没有找到任何可以帮助我解决非二叉树问题的资源。 到目前为止,我做了这个代码: 我的树: 在此处输入图像描述 我需要按以下顺序处理节点