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

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; }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先需要安装 `treelib` 库,这是一个用于构建和操纵树结构的 Python 库。可以使用以下命令进行安装: ```python pip install treelib ``` 接下来,我们可以使用链表来表示二叉树。每个节点需要包含三个信息:值、左子节点和右子节点。我们可以使用类来实现这个节点: ```python class Node: def __init__(self, value): self.value = value self.left = None self.right = None ``` 接着,我们需要实现遍历二叉树的算法。这里我们实现前序遍历、中序遍历和后序遍历。具体实现如下: ```python def preorder_traversal(node): if node: print(node.value) preorder_traversal(node.left) preorder_traversal(node.right) def inorder_traversal(node): if node: inorder_traversal(node.left) print(node.value) inorder_traversal(node.right) def postorder_traversal(node): if node: postorder_traversal(node.left) postorder_traversal(node.right) print(node.value) ``` 现在,我们可以使用这些算法来遍历树,并将树可视化。我们可以使用 `treelib` 库来创建树,然后将每个节点添加到树中。最后,我们可以使用 `treelib` 库的 `to_graphviz` 函数将树可视化为图形。完整代码如下: ```python from treelib import Node, Tree class BinaryTreeNode: def __init__(self, value): self.value = value self.left = None self.right = None def preorder_traversal(node, tree): if node: tree.create_node(node.value, node.value) if node.left: tree.create_node(node.left.value, node.left.value, parent=node.value) preorder_traversal(node.left, tree) if node.right: tree.create_node(node.right.value, node.right.value, parent=node.value) preorder_traversal(node.right, tree) def inorder_traversal(node, tree): if node: if node.left: inorder_traversal(node.left, tree) tree.create_node(node.value, node.value) if node.right: inorder_traversal(node.right, tree) def postorder_traversal(node, tree): if node: if node.left: postorder_traversal(node.left, tree) if node.right: postorder_traversal(node.right, tree) tree.create_node(node.value, node.value) def visualize_tree(root): tree = Tree() if root: tree.create_node(root.value, root.value) preorder_traversal(root, tree) tree.show() root = BinaryTreeNode(1) root.left = BinaryTreeNode(2) root.right = BinaryTreeNode(3) root.left.left = BinaryTreeNode(4) root.left.right = BinaryTreeNode(5) visualize_tree(root) ``` 这段代码将创建以下二叉树,并将其可视化: ``` 1 / \ 2 3 / \ 4 5 ``` 希望这可以帮助你实现二叉树的遍历和可视化

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值