将宽度优先序列转换成二叉树并可视化

本文介绍了一种二叉树的创建与可视化方法,通过层级遍历的方式构建二叉树,并将其以二维数组形式可视化输出,适用于节点值可为0的情况。文章提供了详细的Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

display函数输入是二叉树,输出是将二叉树打印出来(节点值不能是0,可视化的部分还需要优化)
效果如下
在这里插入图片描述

代码

public class Niuke0417 {
    public static void main(String[] args) {
        String[] array_str = {"1", "null", "3"};
        TreeNode root = CreateTree_CengXu(array_str);
        display(root);

        System.out.println("test");
    }

    public static TreeNode CreateTree_CengXu(String[] array){
        ArrayList<TreeNode> mem = new ArrayList<>();

        if(array[0] == "null"){
            return null;
        }
        TreeNode root = new TreeNode(Integer.valueOf(array[0]));
        mem.add(root);
        boolean left_or_not = true;

        for(int i = 1; i < array.length; ++i){
            if(array[i] != "null"){
                if(left_or_not == true){
                    left_or_not = false;

                    TreeNode temp_Node = new TreeNode(Integer.valueOf(array[i]));
                    mem.get(0).left = temp_Node;
                    mem.add(temp_Node);
                }else{
                    left_or_not = true;

                    TreeNode temp_Node = new TreeNode(Integer.valueOf(array[i]));
                    mem.get(0).right = temp_Node;
                    mem.add(temp_Node);
                    mem.remove(0);
                }
            }else{
                if(left_or_not == true){
                    left_or_not = false;

                    mem.get(0).left = null;
                }else{
                    left_or_not = true;

                    mem.get(0).right = null;
                    mem.remove(0);
                }
            }
        }

        return root;
    }

    public static void display(TreeNode root){
        int deepth = GetTreeNodeDeepth(root, 0);
        int len_mem = ((int)(Math.pow(2, deepth - 1))) * 2 - 1;

        int[][] mem_erwei = new int[deepth][len_mem];
        displayCore1(root, mem_erwei, 0, len_mem - 1, 0);
        for(int i = 0; i < mem_erwei.length; ++i){
            for(int j = 0; j < mem_erwei[0].length; ++j){
                if(mem_erwei[i][j] == 0){
                    System.out.printf(" ");
                }else{
                    System.out.print(mem_erwei[i][j]);
                }
            }
            System.out.printf("\r\n");
        }
    }

    public static void displayCore1(TreeNode root, int[][] mem, int begin, int end, int deepth){
        if(root == null){
        }else{
            int cur = (begin + end) / 2;
            mem[deepth][cur] = root.val;
            displayCore1(root.left, mem, begin, cur - 1, deepth + 1);
            displayCore1(root.right, mem, cur + 1, end, deepth + 1);
        }
    }

    public static int GetTreeNodeDeepth(TreeNode root, int deepth){
        if(root == null){
            return deepth;
        }
        ++deepth;
        int deepth_left = GetTreeNodeDeepth(root.left, deepth);
        int deepth_right = GetTreeNodeDeepth(root.right, deepth);

        return Math.max(deepth_left, deepth_right);
    }



    public static class TreeNode {
        public int val;
        public TreeNode left = null;
        public TreeNode right = null;
        TreeNode(int x) { val = x; }
    }
}

进阶版代码,此版本中节点可以是0。但是怕这个版本的代码有bug,所以暂时不删除上个版本的代码。

public class Niuke0417 {
    public static void main(String[] args) {
        String[] array_str = {"0", "null", "3"};
        TreeNode root = CreateTree_CengXu(array_str);
        display(root);

        System.out.println("test");
    }

    public static TreeNode CreateTree_CengXu(String[] array){
        ArrayList<TreeNode> mem = new ArrayList<>();

        if(array[0] == "null"){
            return null;
        }
        TreeNode root = new TreeNode(Integer.valueOf(array[0]));
        mem.add(root);
        boolean left_or_not = true;

        for(int i = 1; i < array.length; ++i){
            if(array[i] != "null"){
                if(left_or_not == true){
                    left_or_not = false;

                    TreeNode temp_Node = new TreeNode(Integer.valueOf(array[i]));
                    mem.get(0).left = temp_Node;
                    mem.add(temp_Node);
                }else{
                    left_or_not = true;

                    TreeNode temp_Node = new TreeNode(Integer.valueOf(array[i]));
                    mem.get(0).right = temp_Node;
                    mem.add(temp_Node);
                    mem.remove(0);
                }
            }else{
                if(left_or_not == true){
                    left_or_not = false;

                    mem.get(0).left = null;
                }else{
                    left_or_not = true;

                    mem.get(0).right = null;
                    mem.remove(0);
                }
            }
        }

        return root;
    }

    public static void display(TreeNode root){
        int deepth = GetTreeNodeDeepth(root, 0);
        int len_mem = ((int)(Math.pow(2, deepth - 1))) * 2 - 1;

        String[][] mem_erwei = new String[deepth][len_mem];
        for(int i = 0; i < deepth; ++i){
            for(int j = 0; j < len_mem; ++j){
                mem_erwei[i][j] = "null";
            }
        }
        displayCore1(root, mem_erwei, 0, len_mem - 1, 0);
        for(int i = 0; i < mem_erwei.length; ++i){
            for(int j = 0; j < mem_erwei[0].length; ++j){
                if(mem_erwei[i][j] == "null"){
                    System.out.printf(" ");
                }else{
                    System.out.print(mem_erwei[i][j]);
                }
            }
            System.out.printf("\r\n");
        }
    }

    public static void displayCore1(TreeNode root, String[][] mem, int begin, int end, int deepth){
        if(root == null){
        }else{
            int cur = (begin + end) / 2;
            mem[deepth][cur] = String.valueOf(root.val);
            displayCore1(root.left, mem, begin, cur - 1, deepth + 1);
            displayCore1(root.right, mem, cur + 1, end, deepth + 1);
        }
    }

    public static int GetTreeNodeDeepth(TreeNode root, int deepth){
        if(root == null){
            return deepth;
        }
        ++deepth;
        int deepth_left = GetTreeNodeDeepth(root.left, deepth);
        int deepth_right = GetTreeNodeDeepth(root.right, deepth);

        return Math.max(deepth_left, deepth_right);
    }



    public static class TreeNode {
        public int val;
        public TreeNode left = null;
        public TreeNode right = null;
        TreeNode(int x) { val = x; }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值