LeetCode的二叉树题目输入通常采用层序遍历的数组形式,其中空节点用null表示,开发者在本地IDE调试时需要手动将这种格式转换为可操作的二叉树结构,核心就是实现输入字符串到树节点的解析逻辑。

LeetCode二叉树输入格式规则
LeetCode的二叉树输入遵循层序遍历的顺序,具体规则如下:
- 数组的第一个元素为二叉树的根节点值
- 后续元素按照层序遍历的顺序依次排列,空节点用
null表示 - 输入通常以字符串形式给出,比如
[1,2,3,null,5,null,4]对应根节点为1,左子节点2,右子节点3,2的右子节点5,3的右子节点4的二叉树
解析核心逻辑
解析过程主要分为三步:
- 将输入的字符串处理为值列表,去除方括号,分割元素并转换类型,null值保留标记
- 创建根节点,使用队列存储待处理节点,按层序遍历的顺序依次为每个节点分配左右子节点
- 遍历值列表,每次从队列中取出一个节点,依次为其分配当前索引对应的左右子节点,非空子节点加入队列继续处理
Python实现示例
以下是Python语言的完整解析实现:
from collections import deque
# 定义二叉树节点类
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def load_leetcode_tree(input_str):
# 处理输入字符串,去掉方括号,分割为元素列表
elements = input_str.strip('[').strip(']').split(',')
if not elements or elements[0] == '':
return None
# 转换元素类型,null转为None
vals = []
for elem in elements:
elem = elem.strip()
if elem == 'null':
vals.append(None)
else:
vals.append(int(elem))
# 创建根节点
root = TreeNode(vals[0])
queue = deque([root])
idx = 1
# 层序遍历分配子节点
while queue and idx < len(vals):
node = queue.popleft()
# 分配左子节点
if idx < len(vals) and vals[idx] is not None:
node.left = TreeNode(vals[idx])
queue.append(node.left)
idx += 1
# 分配右子节点
if idx < len(vals) and vals[idx] is not None:
node.right = TreeNode(vals[idx])
queue.append(node.right)
idx += 1
return root
# 测试示例
if __name__ == '__main__':
input_str = '[1,2,3,null,5,null,4]'
tree_root = load_leetcode_tree(input_str)
# 层序遍历验证结果
res = []
q = deque([tree_root])
while q:
node = q.popleft()
if node:
res.append(node.val)
q.append(node.left)
q.append(node.right)
else:
res.append(None)
# 去除末尾多余的null
while res and res[-1] is None:
res.pop()
print(res)
Java实现示例
以下是Java语言的完整解析实现:
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
// 定义二叉树节点类
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
public class LeetCodeTreeLoader {
public static TreeNode loadLeetCodeTree(String inputStr) {
// 处理输入字符串,去掉方括号,分割元素
String content = inputStr.substring(1, inputStr.length() - 1);
if (content.isEmpty()) {
return null;
}
String[] elemStrs = content.split(",");
List<Integer> vals = new ArrayList<>();
for (String elem : elemStrs) {
elem = elem.trim();
if (elem.equals("null")) {
vals.add(null);
} else {
vals.add(Integer.parseInt(elem));
}
}
// 创建根节点
TreeNode root = new TreeNode(vals.get(0));
Deque<TreeNode> queue = new ArrayDeque<>();
queue.offer(root);
int idx = 1;
// 层序遍历分配子节点
while (!queue.isEmpty() && idx < vals.size()) {
TreeNode node = queue.poll();
// 分配左子节点
if (idx < vals.size() && vals.get(idx) != null) {
node.left = new TreeNode(vals.get(idx));
queue.offer(node.left);
}
idx++;
// 分配右子节点
if (idx < vals.size() && vals.get(idx) != null) {
node.right = new TreeNode(vals.get(idx));
queue.offer(node.right);
}
idx++;
}
return root;
}
// 测试示例
public static void main(String[] args) {
String inputStr = "[1,2,3,null,5,null,4]";
TreeNode root = loadLeetCodeTree(inputStr);
// 层序遍历验证结果
Deque<TreeNode> queue = new ArrayDeque<>();
queue.offer(root);
List<Integer> res = new ArrayList<>();
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
if (node != null) {
res.add(node.val);
queue.offer(node.left);
queue.offer(node.right);
} else {
res.add(null);
}
}
// 去除末尾多余的null
while (!res.isEmpty() && res.get(res.size() - 1) == null) {
res.remove(res.size() - 1);
}
System.out.println(res);
}
}
注意事项
在实际使用时需要注意几个细节:
- 输入字符串的格式要严格匹配LeetCode的输出格式,避免多余空格或符号导致解析错误
- null值的判断要和LeetCode的规则一致,不要自行修改标记方式
- 如果本地调试时需要修改输入,只需要替换传入的字符串参数即可,不需要调整解析逻辑