leetcode建树
在leetcode上刷题是核心代码模式,所以我们对于输入,输出不需要很了解,一次偶然的发现leetcode建树不是常见的类似前序遍历建树。
以下图为例说明
如果是前序遍历建树那么必定是[3,9,null,null,20,15,null,null,7,null,null]来完成建树的,以先建根再创建左子树和右子树的方式。但是leetcode给出的建树序列却是 [3,9,20,null,null,15,7],我们发现它是一层一层的建树的,首先第一层 3,再是第二层 9,20,再是第三层 null,null,15,7。很容易联想到我们的广度优先搜索算法,首先根入队列,出队后入队非空左右子树,然后出队左右子树,再入队左右子树各自的左右子树...递归下去,就是一层一层创建树了。
代码实例
class TreeNode {//树
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
public class CreateTree {
public static void main(String[] args) {
TreeNode root = create();//建树
show(root);//前序遍历树
}
private static void show(TreeNode root){
if (root == null) return;
System.out.print(root.val+" ");
show(root.left);
show(root.right);
}
private static TreeNode create() {
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
String substring = str.substring(1, str.length()-1);
String[] strs = substring.split(",");//获取输入的字符串序列
if (strs.length == 0) return null;
Queue<TreeNode> queue = new LinkedList<>();
TreeNode root = new TreeNode(Integer.parseInt(strs[0]));
queue.offer(root);
int i=1;//记录序列遍历数量
while (i<strs.length){
int size = queue.size();//记录当前层次的节点数量
for (int j = 0;j<size;j++){
TreeNode t = queue.poll();
if (!strs[i].equals("null")){
t.left = new TreeNode(Integer.parseInt(strs[i]));
queue.offer(t.left);//非空子树入队
}
i++;
if (!strs[i].equals("null")){
t.right = new TreeNode(Integer.parseInt(strs[i]));
queue.offer(t.right);
}
i++;
}
}
return root;
}
}
ps:写完之后发现力扣右上角有个打开面板图标,白写了QAQ,打开后就有main方法和其他调用方法了,我和上面是差不多的写法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话