leetcode 根据数组创建二叉树

时间:2025-04-06 14:05:06

在刷leetcode题目时,在刷LeetCode的时候,经常碰到树或二叉树模型的题目。为了调试方便,需要在本地IDE上实现对二叉树的创建。题目给出的是一个含有null的数组。
如:

[5,4,8,11,null,13,4,7,2,null,null,5,1]

首先我们需要创建一个数组。注意由于包含null值,因此肯定不能用int整型数组。由于Integer是引用类型,默认值为null,故可以创建一个Integer类型数组:

Integer[] arr = {5,4,8,11,null,13,4,7,2,null,null,5,1};

本文参考了这篇文章的思想:LeetCode(力扣)题目中二叉树的如何生成?根据给定顺序列表生成二叉树 。这里给出的是用python队列实现的二叉树创建。下面给出java实现的二叉树创建代码

  static TreeNode createBT(Integer[] array){
        if (array.length == 0){
            return null;
        }
        // 创建第一个结点
        TreeNode root = new TreeNode(array[0]);
        Deque<TreeNode> deque = new LinkedList<>();
        deque.addFirst(root);
        // 遍历子结点的方向
        boolean isLeft = true;
        for (int i = 1; i < array.length; i++) {
            // 取出队尾元素
            TreeNode node = deque.getLast();
            if (isLeft){
                if (array[i]!=null){
                    node.left = new TreeNode(array[i]);
                    deque.addFirst(node.left);
                }
                isLeft = false;
            }else{
                if (array[i]!=null){
                    node.right = new TreeNode(array[i]);
                    deque.addFirst(node.right);
                }
                // 删除队尾元素
                deque.removeLast();
                isLeft = true;
            }
        }
        return root;
    }

由于遍历建树的过程中涉及到对队列尾部元素的查询和删除操作,所有使用的双端队列Deque。


注意:

网上常见的那种递归创建二叉树的算法(如下图所示)是有问题的。

    static TreeNode createBT(int[] array, int index){  
     // 该算法有问题
        TreeNode root = null;
        if (index >=array.length||array[index] == -1){
            return null;
        }
        root = new TreeNode(array[index]);
        root.left = createBT(array,2*index+1);
        root.right = createBT(array,2*index+2);
        return root;
    }

因为当index取值对应到的值为null时,程序会直接返回,结束本次递归。这可能会错过本应该在下一次递归时创建的树结点。如创建斜树:

[1,null,2,null,3]

3结点最终不会被创建。

相关文章