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方法和其他调用方法了,我和上面是差不多的写法。

posted @   州牧  阅读(172)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示