根据数组生成二叉树,精简数组还原二叉树

刷Leetcode 144题的时候,遇到一个精简的数组(父节点为null),以此生成二叉树,进行前序遍历。因为二叉树生成不许需要编码,leetcode后台生成。但是,如果我能用代码把这个二叉树构建出来的话,,不管是前序/中序还是后续,都能随心所欲了。于是试着构建这个二叉树。为了方便理解,精简的数组构建成了完全二叉树(不是满二叉树),null节点的子节点也补全为null。

输入: [1,null,2,3]  
   1
    \
     2
    /
   3 

输出: [1,2,3]

二叉树类结构:

class TreeNode<T> {
    public T val;
    public TreeNode left;
    public TreeNode right;

    public TreeNode(T val) {
        this.val = val;
    }
}

生成一棵二叉树,使用LinkedList存储节点,方便补全为完全二叉树。

public static <T> TreeNode buildBinaryTree(T[] arr) {
    //使用LinkedList,方便补全null
    List<TreeNode> linkedList = new LinkedList<>();
    if (arr.length < 1) return null;
    int len = arr.length;
    for (int i = 0; i < len; i++) {
        if (arr[i] == null) linkedList.add(null);
        else linkedList.add(new TreeNode(arr[i]));
    }
    //i树的索引,最高二叉树高度是n/2+1
    for (int i = 0; i <= linkedList.size() / 2 - 1; i++) {
        //父节点为null,就没有子节点
        if (linkedList.get(i) == null) {
            //父节点为null,需要在链表合适位置(2i+1,2i+2)处补上null作为子节点
            linkedList.add(2 * i + 1, null);
            linkedList.add(2 * i + 2, null);
            continue;
        }
        // 左结点是否为空,左节点是否被列出
        if ((2 * i + 1) < linkedList.size() && linkedList.get(2 * i + 1) != null) {
            linkedList.get(i).left = linkedList.get(2 * i + 1);
            double db = Math.log((linkedList.size() / Math.log(2)));
            int depth = new BigDecimal(db).intValue();
        }
        //右节点是否为空,右节点是否被列出
        if ((2 * i + 2) < linkedList.size() && linkedList.get(2 * i + 2) != null) {
            linkedList.get(i).right = linkedList.get(2 * i + 2);
        }
    }
    return linkedList.get(0);
}

递归方法前序遍历二叉树:

public static <T> List<T> preorderTraversal(TreeNode<T> root, List<T> resultList) {
    if (root==null){
        return resultList;
    }
    resultList.add(root.val);
    preorderTraversal(root.left, resultList);
    preorderTraversal(root.right, resultList);
    return resultList;
}

测试方法:

    public static void main(String[] args) {
        Integer[] arr = new Integer[]{1, null, 2, 3};
//        Character[] chars = new Character[]{'A', 'B','C','D','E','F','G'};
        TreeNode root = buildBinaryTree(arr);
        List<Integer> resultList = new ArrayList<>();
        System.out.println(preorderTraversal(root, resultList));
    }

 二叉树的前中后序遍历请参考:https://www.jianshu.com/p/456af5480cee,大神写的很详细了,膜拜

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值