建立打印LeetCode中的二叉树
在刷力扣题时遇到二叉树的问题时,建树较为麻烦,打印树更加是不方便。
因为力扣中二叉树定义多为
1 2 3 4 5 6
| public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int val) { this.val = val; } }
|
再增加建树的成员方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| public static TreeNode creatABitTree(Integer[] nums) {
if (nums.length == 0 || nums[0] == null) return null; if (nums.length == 1) return new TreeNode(nums[0]);
Queue<TreeNode> queue = new LinkedList<>(); TreeNode node = new TreeNode(nums[0]); queue.offer(node);
TreeNode temp; for (int i = 1; i < nums.length; ) { temp = queue.poll(); if (nums[i] != null) { assert temp != null; temp.left = new TreeNode(nums[i++]); queue.offer(temp.left); } else i++; if (i >= nums.length) break; if (nums[i] != null) { assert temp != null; temp.right = new TreeNode(nums[i++]); queue.offer(temp.right); } else i++; }
return node; }
|
参考 StackOverflow中How to print binary tree diagram?这个问答,再添加树的打印方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public StringBuilder toString(StringBuilder prefix, boolean isTail, StringBuilder sb) { if (right != null) { right.toString(new StringBuilder().append(prefix).append(isTail ? "│ " : " "), false, sb); } sb.append(prefix).append(isTail ? "└── " : "┌── ").append(val).append("\n"); if (left != null) { left.toString(new StringBuilder().append(prefix).append(isTail ? " " : "│ "), true, sb); } return sb; }
@Override public String toString() { return this.toString(new StringBuilder(), true, new StringBuilder()).toString(); }
|
测试
使用以下测试函数
1 2 3 4 5 6 7 8
| class Main { public static void main(String[] args) { TreeNode treeNode = TreeNode.creatABitTree(new Integer[]{ 0,1,2,3,4,5,6 }); System.out.println(treeNode); } }
|
获得的测试结果:
1 2 3 4 5 6 7
| │ ┌── 6 │ ┌── 2 │ │ └── 5 └── 0 │ ┌── 4 └── 1 └── 3
|
完整的TreeNode类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| import java.util.LinkedList; import java.util.Queue;
public class TreeNode { int val; TreeNode left; TreeNode right;
TreeNode(int val) { this.val = val; }
public static TreeNode creatABitTree(Integer[] nums) {
if (nums.length == 0 || nums[0] == null) return null; if (nums.length == 1) return new TreeNode(nums[0]);
Queue<TreeNode> queue = new LinkedList<>(); TreeNode node = new TreeNode(nums[0]); queue.offer(node);
TreeNode temp; for (int i = 1; i < nums.length; ) { temp = queue.poll(); if (nums[i] != null) { assert temp != null; temp.left = new TreeNode(nums[i++]); queue.offer(temp.left); } else i++; if (i >= nums.length) break; if (nums[i] != null) { assert temp != null; temp.right = new TreeNode(nums[i++]); queue.offer(temp.right); } else i++; }
return node; }
public StringBuilder toString(StringBuilder prefix, boolean isTail, StringBuilder sb) { if (right != null) { right.toString(new StringBuilder().append(prefix).append(isTail ? "│ " : " "), false, sb); } sb.append(prefix).append(isTail ? "└── " : "┌── ").append(val).append("\n"); if (left != null) { left.toString(new StringBuilder().append(prefix).append(isTail ? " " : "│ "), true, sb); } return sb; }
@Override public String toString() { return this.toString(new StringBuilder(), true, new StringBuilder()).toString(); }
}
|