LeetCode 刷题【103. 二叉树的锯齿形层序遍历、104. 二叉树的最大深度、105. 从前序与中序遍历序列构造二叉树】

103. 二叉树的锯齿形层序遍历

自己做

解:先序遍历

java 复制代码
/**
 * Definition for a binary tree node.
 * public 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;
 *     }
 * }
 */
class Solution {
    List<List<Integer>> res = new ArrayList();
    public void preTravelTree(TreeNode root, int level){
        if(root == null)
            return;
        
        if(res.size() == level){                //添加列表【新的一层】
            List<Integer> new_level = new ArrayList();
            new_level.add(root.val);
            res.add(new_level);
        }
        else{                                   //已有列表
            List<Integer> old_level = res.get(level);
            if(level % 2 == 1){                 //奇数层,头插
                old_level.addFirst(root.val);
            }
            else{                               //偶数层,尾插
                old_level.addLast(root.val);
            }
        }

        preTravelTree(root.left, level + 1);
        preTravelTree(root.right, level + 1);
    }


    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        preTravelTree(root, 0);
        return res;
    }
}

104. 二叉树的最大深度

自己做

解:先序遍历

java 复制代码
/**
 * Definition for a binary tree node.
 * public 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;
 *     }
 * }
 */
class Solution {
    private int min_level = 0;

    public void preTravelTree(TreeNode root, int level){
        if(root == null)
            return;

        if(level > min_level)
            min_level = level;

        preTravelTree(root.left, level + 1);
        preTravelTree(root.right, level + 1);
    }

    public int maxDepth(TreeNode root) {
        preTravelTree(root, 1);
        return min_level;
    }
}

105. 从前序与中序遍历序列构造二叉树

自己做

解1:划分回溯

java 复制代码
/**
 * Definition for a binary tree node.
 * public 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;
 *     }
 * }
 */
class Solution {
    private int i = 0;

    public TreeNode inorderTravel(int[] preorder, int[] inorder, int begin, int end){
        if(begin > end)                                                         //到底了
            return null;

        TreeNode root = new TreeNode(preorder[i++]);                            //当前结点
        
        int mid = begin;                                                        //记录划分位置
        for(int j = begin; j <= end && preorder[i - 1] != inorder[mid]; j++)    //找划分位置
            mid++;

        TreeNode left = inorderTravel(preorder, inorder, begin, mid - 1);      //左子树
        TreeNode right = inorderTravel(preorder, inorder, mid + 1, end);       //右子树
        root.left = left;
        root.right =right;

        return root;
    }

    public TreeNode buildTree(int[] preorder, int[] inorder) {
        return inorderTravel(preorder, inorder, 0, preorder.length - 1);
    }
}

解2:哈希集合版

java 复制代码
/**
 * Definition for a binary tree node.
 * public 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;
 *     }
 * }
 */
class Solution {
    private int i = 0;
    Map<Integer, Integer> m = new HashMap();                                     //构建键值对集合

    public TreeNode inorderTravel(int[] preorder, int[] inorder, int begin, int end){
        if(begin > end)                                                         //到底了
            return null;

        int mid = m.get(preorder[i]);                                           //获得分割点
        TreeNode root = new TreeNode(preorder[i++]);                            //当前结点
        TreeNode left = inorderTravel(preorder, inorder, begin, mid - 1);       //左子树
        TreeNode right = inorderTravel(preorder, inorder, mid + 1, end);        //右子树
        root.left = left;
        root.right =right;

        return root;
    }

    public TreeNode buildTree(int[] preorder, int[] inorder) {
        for(int i = 0; i < preorder.length; i++)
            m.put(preorder[i], 0);
        for(int i = 0; i < preorder.length; i++)
            m.put(inorder[i], i);
        
        return inorderTravel(preorder, inorder, 0, preorder.length - 1);
    }
}
相关推荐
测试199825 分钟前
Python接口测试之requests库安装和导入
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
浅念-27 分钟前
MySQL 索引底层完整详解|磁盘Page|B+树推导|聚簇非聚簇索引|索引SQL操作
大数据·数据库·b树·sql·mysql·面试·职场和发展
Tyler_TXZ31 分钟前
C++C语言之——树
c语言·c++·算法·
旖旎夜光40 分钟前
LeetCode 30:串联所有单词的子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
白狐_7981 小时前
408 数据结构|完全二叉树两道典型题:第 6 层叶结点数与叶结点总数
数据结构·算法
lucas_AI1 小时前
喂张白纸也能吐出证件号?文档 MLLM 的"关系级泄露"被测出来了
人工智能·算法·掘金技术征文
手写码匠1 小时前
华为云Flexus+DeepSeek征文|Dify 多 Agent 灰度发布实战:让每一次变更都“小步快跑、随时可回滚“
人工智能·深度学习·算法·aigc
我命由我123451 小时前
商圈六大配套
学习·职场和发展·求职招聘·职场发展·产品经理·学习方法·零售
Dr.kangder1 小时前
嵌入式面试总结(二十二)——指针
java·面试·职场和发展·架构·嵌入式
阿部多瑞 ABU1 小时前
从0到1:用 Spring Boot 3.4 + Vue3 做一个能“智能排道次“的运动会编排系统(附核心算法)
java·spring boot·后端·算法·spring