每日5题Day21 - LeetCode 101 - 105

每一步向前都是向自己的梦想更近一步,坚持不懈,勇往直前!

第一题:101. 对称二叉树 - 力扣(LeetCode)

java 复制代码
class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root == null){
            return true;
        }
        Stack<TreeNode> st = new Stack();
        st.push(root.left);
        st.push(root.right);
        while(!st.isEmpty()){
            TreeNode nodeA = st.pop();
            TreeNode nodeB = st.pop();
            if(nodeA == null && nodeB == null){
                continue;
            }
            if((nodeA == null && nodeB != null) || (nodeA != null && nodeB == null) || nodeA.val != nodeB.val){
                return false;
            }
            st.push(nodeA.left);
            st.push(nodeB.right);
            st.push(nodeA.right);
            st.push(nodeB.left);
        }
        return true;
    }
}

显然,我们使用栈来递归的速度是很慢的,只要是树,我们就用递归好了,天然有优势(对于每一个节点,面临的问题相同,符合复杂问题分为子问题这一原则)。

java 复制代码
class Solution {
    public boolean isSymmetric(TreeNode root) {
        if (root == null) {
            return true;
        }
        return isMirror(root.left, root.right);
    }

    private boolean isMirror(TreeNode left, TreeNode right) {
        // 如果两个节点都为空,视为对称
        if (left == null && right == null) {
            return true;
        }
        // 如果有一个节点为空,或者节点值不相等,不对称
        if (left == null || right == null || left.val != right.val) {
            return false;
        }
        // 递归判断左子树的左子节点和右子树的右子节点,以及左子树的右子节点和右子树的左子节点
        return isMirror(left.left, right.right) && isMirror(left.right, right.left);
    }
}
java 复制代码
class Solution {
    public boolean isSymmetric(TreeNode root) {
        if (root == null) {
            return true;
        }
        return isMirror(root.left, root.right);
    }

    private boolean isMirror(TreeNode left, TreeNode right) {
        // 如果两个节点都为空,视为对称
        if (left == null && right == null) {
            return true;
        }
        // 如果有一个节点为空,或者节点值不相等,不对称
        if (left == null || right == null || left.val != right.val) {
            return false;
        }
        // 递归判断左子树的左子节点和右子树的右子节点,以及左子树的右子节点和右子树的左子节点
        return isMirror(left.left, right.right) && isMirror(left.right, right.left);
    }
}

第二题:102. 二叉树的层序遍历 - 力扣(LeetCode)

java 复制代码
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        if(root == null){
            return new ArrayList<>();
        }
        List<List<Integer>> res = new ArrayList<>();
        Deque<TreeNode> deque = new ArrayDeque<>();
        deque.offerLast(root);
        while(!deque.isEmpty()){
            //主要每一层都用一个list,结束之后把这个list add到res中
            int len = deque.size();
            List<Integer> path = new ArrayList<>();
            while(len-- > 0){
                TreeNode node = deque.pollFirst();
                path.add(node.val);
                if(node.left != null){
                    deque.offerLast(node.left);
                }
                if(node.right != null){
                    deque.offerLast(node.right);
                }
            }
            res.add(path);
        }
        return res;
    }
}

第三题:103. 二叉树的锯齿形层序遍历 - 力扣(LeetCode)

java 复制代码
import java.util.*;

class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        if(root == null){
            return new ArrayList<>();
        }
        List<List<Integer>> res = new ArrayList<>();
        Deque<TreeNode> deque = new ArrayDeque<>();
        deque.offerLast(root);
        //多一个判断而已,本质与102题没有区别
        int flag = 1;
        while(!deque.isEmpty()){
            int len = deque.size();
            List<Integer> path = new ArrayList<>();
            for(int i = 0; i < len; i++){
                TreeNode node;
                if(flag == 1){
                    node = deque.pollFirst();
                    if(node.left != null){
                    deque.offerLast(node.left);
                    }
                    if(node.right != null){
                        deque.offerLast(node.right);
                    }
                } else {
                    node = deque.pollLast();
                    if(node.right != null){
                    deque.offerFirst(node.right);
                    }
                    if(node.left != null){
                        deque.offerFirst(node.left);
                    }
                }
                path.add(node.val);
                
            }
            res.add(path);
            flag = -flag; // 改变方向
        }
        return res;
    }
}

第四题:104. 二叉树的最大深度 - 力扣(LeetCode)

java 复制代码
class Solution {
    public int maxDepth(TreeNode root) {
        if(root == null){
            return 0;
        }
        int left = maxDepth(root.left);
        int right = maxDepth(root.right);
        //挑选最高的一个分支加上来
        return Math.max(left, right) + 1;
    }
}

第五题:105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)

java 复制代码
class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        //因为前序的第一个一定是根节点
        //中序可以找到根节点,该节点左边一定属于左子树,右边一定属于右子树
        //所以我们通过一个map记录下位置,可以采用迭代的方式来一个个确定位置
        Map<Integer, Integer> map = new HashMap<>();
        for(int i = 0; i < inorder.length; i++){
            map.put(inorder[i], i);
        }
        TreeNode head = helper(0, preorder.length - 1, map, preorder, 0);
        return head;
    }

    private static TreeNode helper(int low, int high, Map<Integer, Integer> map, int[] preorder, int idx){
        if(low > high){
            return null;
        }
        int val = preorder[idx];
        int index = map.get(val);
        TreeNode head = new TreeNode(val);
        head.left = helper(low, index - 1, map, preorder, idx + 1);
        head.right = helper(index + 1, high, map, preorder, idx + (index - low) + 1);
        return head;
    }
}

相关推荐
ゞ 正在缓冲99%…11 分钟前
leetcode76.最小覆盖子串
java·算法·leetcode·字符串·双指针·滑动窗口
xuanjiong12 分钟前
纯个人整理,蓝桥杯使用的算法模板day2(0-1背包问题),手打个人理解注释,超全面,且均已验证成功(附带详细手写“模拟流程图”,全网首个
算法·蓝桥杯·动态规划
惊鸿.Jh31 分钟前
【滑动窗口】3254. 长度为 K 的子数组的能量值 I
数据结构·算法·leetcode
明灯L32 分钟前
《函数基础与内存机制深度剖析:从 return 语句到各类经典编程题详解》
经验分享·python·算法·链表·经典例题
碳基学AI38 分钟前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义免费下载方法
大数据·人工智能·python·gpt·算法·语言模型·集成学习
补三补四41 分钟前
机器学习-聚类分析算法
人工智能·深度学习·算法·机器学习
独好紫罗兰1 小时前
洛谷题单3-P5718 【深基4.例2】找最小值-python-流程图重构
开发语言·python·算法
正脉科工 CAE仿真1 小时前
基于ANSYS 概率设计和APDL编程的结构可靠性设计分析
人工智能·python·算法
Dovis(誓平步青云)1 小时前
【数据结构】排序算法(中篇)·处理大数据的精妙
c语言·数据结构·算法·排序算法·学习方法
2401_872945092 小时前
【补题】Xi‘an Invitational 2023 E. Merge the Rectangles
算法