最近在刷leetcode二叉树,发现二叉树的数据结构构造很麻烦,我写了个工具类,可以方便构造数据。支持直接复制leetcode上面的数据直接生成TreeNode对象
先看使用:
@Test
public void test() {
String input = "[1,2,3,null,5,6,7]";
TreeNode treeNode = ArrayUtil.toTreeNode(input);
}
工具类如下:
public class ArrayUtil {
public static TreeNode toTreeNode(String arrStr) {
Integer[] array = toIntegerArray(arrStr);
if (array.length == 0) {
return null;
}
Queue<TreeNode> queue = new LinkedList<>();
TreeNode root = new TreeNode(array[0]);
queue.offer(root);
boolean isLeft = true;
for (int i = 1; i < array.length; i++) {
TreeNode node = queue.peek();
if (isLeft) {
if (array[i] != null) {
node.left = new TreeNode(array[i]);
queue.offer(node.left);
}
isLeft = false;
} else {
if (array[i] != null) {
node.right = new TreeNode(array[i]);
queue.offer(node.right);
}
isLeft = true;
queue.poll();
}
}
return root;
}
public static Integer[] toIntegerArray(String numStr) {
String subNum = numStr.substring(1, numStr.length() - 1);
if ("".equals(subNum.trim())) {
return new Integer[0];
}
String[] strArray = subNum.split("\\s*,\\s*");
Integer[] integerArray = new Integer[strArray.length];
for (int j = 0; j < strArray.length; j++) {
String trimNum = strArray[j];
if ("null".equals(trimNum)) {
integerArray[j] = null;
} else {
integerArray[j] = Integer.parseInt(trimNum);
}
}
return integerArray;
}
}
如何验证这个工具类的正确性呢?我写了一套测试用例,思路是将工具类得到的TreeNode对象,通过广度优先搜索方式还原为原来的数组,再与输入进行比较是否相同,分别测试了3种情况:
- 为空
- 只包含数字
- 包含数字和null
public class ArrayUtilTest {
@Test
public void test_toTreeNode_isNull() {
TreeNode treeNode = ArrayUtil.toTreeNode("[]");
assertNull(treeNode);
}
@Test
public void test_toTreeNode_isAllNum() {
String input = "[1,2,3,4,5,6,7]";
TreeNode treeNode = ArrayUtil.toTreeNode(input);
String expect = Arrays.toString(ArrayUtil.toIntegerArray(input));
String actual = parseTreeNode(treeNode).toString();
assertEquals(expect, actual);
}
@Test
public void test_toTreeNode_hasNull1() {
String input = "[1,2,3,null,5,6,7]";
TreeNode treeNode = ArrayUtil.toTreeNode(input);
String expect = Arrays.toString(ArrayUtil.toIntegerArray(input));
String actual = parseTreeNode(treeNode).toString();
assertEquals(expect, actual);
}
@Test
public void test_toTreeNode_hasNull2() {
String input = "[1,2,3,4,null,null,7]";
TreeNode treeNode = ArrayUtil.toTreeNode(input);
String expect = Arrays.toString(ArrayUtil.toIntegerArray(input));
String actual = parseTreeNode(treeNode).toString();
assertEquals(expect, actual);
}
private List<Integer> parseTreeNode(TreeNode root) {
List<Integer> result = new ArrayList<>();
if (root == null) {
return result;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
result.add(root.val);
while (!queue.isEmpty()) {
int levelSize = queue.size();
for (int i = 0; i < levelSize; i++) {
TreeNode node = queue.poll();
if (node.left == null && node.right == null) {
continue;
}
if (node.left == null) {
result.add(null);
} else {
queue.offer(node.left);
result.add(node.left.val);
}
if (node.right == null) {
result.add(null);
} else {
queue.offer(node.right);
result.add(node.right.val);
}
}
}
return result;
}
}
花了两个小时写的,希望对大家有帮助。
本文介绍了一个用于从字符串快速构造二叉树节点的Java工具类,并提供了测试用例,包括空树、全数字和含null值的情况。测试用例通过广度优先搜索将构造的二叉树还原为原始数组,验证工具类的正确性。

1519

被折叠的 条评论
为什么被折叠?



