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; }
}
}