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

如何从预序和中序遍历中查找级别顺序遍历

罗鸿福
2023-03-14

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

共有1个答案

丁雅逸
2023-03-14

这是我的解决方案

>

  • 从索引和预排序遍历构建树。

    遍历树并查找级别顺序遍历。

    
    public class PreAndInOrderToLevelOrderTraversal {
        static class Node {
            int val;
            Node left;
            Node right;
            public Node(int val) {
                this.val = val;
                left = null;
                right = null;
            }
        }
    
        static int[] pre;
        static int[] in;
        static ConcurrentHashMap<Integer, Integer> map;
        static Node treeRoot;
        static int preIndex = 0;
    
        public static void main(String[] args) {
            map = new ConcurrentHashMap<>();
            pre = new int[]{1, 2, 4, 5, 3};
            in = new int[]{4, 2, 5, 1, 3};
    
            treeRoot = buildTreeFromPreorderAndInOrder(pre, in, map);
            System.out.println(treeRoot.val);
            printLevelOrder();
        }
    
        public static void printLevelOrder() {
            Queue<Node> queue = new LinkedList<Node>();
            queue.add(treeRoot);
            while (!queue.isEmpty()) {
    
                /* poll() removes the present head.
                For more information on poll() visit
                http://www.tutorialspoint.com/java/util/linkedlist_poll.htm */
                Node tempNode = queue.poll();
                System.out.print(tempNode.val + " ");
    
                /*Enqueue left child */
                if (tempNode.left != null) {
                    queue.add(tempNode.left);
                }
    
                /*Enqueue right child */
                if (tempNode.right != null) {
                    queue.add(tempNode.right);
                }
            }
    
        }
    
        private static Node buildTreeFromPreorderAndInOrder(int[] pre, int[] in, ConcurrentHashMap<Integer, Integer> map) {
            // location of the item in the inorder traversal to find it quick in O(1)
            for (int i = 0; i < in.length; i++) {
                map.put(in[i], i);
            }
            return helper(in, pre, 0, pre.length - 1, map);
        }
    
        private static Node helper(int[] in, int[] pre, int inStart, int inEnd, ConcurrentHashMap<Integer, Integer> map) {
            if (inStart > inEnd) return null;
            int curr = pre[preIndex++];
            Node tNode = new Node(curr);
            if (inStart == inEnd) return tNode;
            int inIndex = map.get(curr);
            tNode.left = helper(in, pre, inStart, inIndex - 1, map);
            tNode.right = helper(in, pre, inIndex + 1, inEnd, map);
            return tNode;
        }
    }
    
    
    

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

    • 我试图使用队列的链表实现实现二叉搜索树的级别顺序遍历。 我已经检查了二叉查找树的实现,它是好的。队列的链表实现也是正确的。在这里,我试图访问节点并将其子节点排队。然后使用弹出函数实际访问节点。 这最终是通过递归调用完成的。当我运行以下代码时,我以不同的顺序获得输出。

    • 我已经实现了一种方法来对一棵树(不是二叉树)进行预排序遍历。此树的每个父节点都有一个子节点数组,因此我使用的方法是: 将子节点链接到父节点“tnAA”的示例 但它只输出根节点,这种方法有什么问题? 解决方案:将children数组链接到每个parent:tnaa . setchildern(AA _ childern);

    • 我在研究一个重建二叉查找树的函数。我正试着先用手做。 说我有:pre-10,3,5,4,15,7,8,2,9,20 in-4,5,3,15,10,20,8,7,9,20 我弄不明白。我知道10必须是根,顺序序列中10左边的所有数字都必须在右边的子树中。 那会给我 4,5,3,15 15大于10,并且为了成为二叉查找树,左子树中的所有节点应该小于根。 这是否意味着这两个序列形成了一个无效的二叉搜索树

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

    • 问题内容: 请看下面我的地图 我正在按钥匙的大小顺序遍历此地图 但是,这打印出来 有没有一种方法可以按键的大小顺序打印出来,所以,我想像这样遍历这张地图 等等… 非常感谢您的帮助! 问题答案: 收集所有键,对它们进行排序,然后按键迭代地图,如下所示: