当前位置: 首页 > news >正文

力扣hot100第五天

二叉树

94.二叉树的中序遍历

题目

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

代码

class Solution {
List ans = new ArrayList<>();

public List<Integer> inorderTraversal(TreeNode root) {
    if (root != null) {
        inorderTraversal(root.left);
        ans.add(root.val);
        inorderTraversal(root.right);
    }
    return ans;
}

}

前序遍历

class Solution {
List ans = new ArrayList<>();

public List<Integer> preorderTraversal(TreeNode root) {
    if (root == null) return new ArrayList<>();
    ans.add(root.val);
    preorderTraversal(root.left);
    preorderTraversal(root.right);
    return ans;
}

}

后序遍历

class Solution {
List ans = new ArrayList<>();

public List<Integer> postorderTraversal(TreeNode root) {
    if (root == null) return new ArrayList<>();
    postorderTraversal(root.left);
    postorderTraversal(root.right);
    ans.add(root.val);
    return ans;
}

}

104.二叉树的最大深度

题目

给定一个二叉树 root ,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
在这里插入图片描述

代码

class Solution {
public int maxDepth(TreeNode root) {
if (root == null) return 0;
return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
}
}

226.翻转二叉树

题目

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
在这里插入图片描述

代码

class Solution {
public TreeNode invertTree(TreeNode root) {
if (root == null) return root;
TreeNode left = invertTree(root.left);
TreeNode right = invertTree(root.right);
root.right = left;
root.left = right;
return root;
}
}

101.对称二叉树

题目

给你一个二叉树的根节点 root , 检查它是否轴对称。
在这里插入图片描述

代码

class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) return true;
return isSymmetric(root.left, root.right);
}

public boolean isSymmetric(TreeNode left, TreeNode right) {
    if (left == null && right == null) return true;
    if (left == null || right == null) return false;
    if (left.val != right.val) return false;
    return isSymmetric(left.left, right.right) && isSymmetric(left.right, right.left);
}

}

543.二叉树的直径

题目

给你一棵二叉树的根节点,返回该树的 直径 。
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。
两节点之间路径的 长度 由它们之间边数表示。
在这里插入图片描述

代码

class Solution {
int ans = 0;

public int diameterOfBinaryTree(TreeNode root) {
    if (root == null) return 0;
    depth(root);
    return ans;
}

public int depth(TreeNode root) {
    if (root == null) return 0;
    int left = depth(root.left);
    int right = depth(root.right);
    ans = Math.max(ans, left + right);
    return 1 + Math.max(left, right);
}

}

102.二叉树的层序遍历

题目

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
在这里插入图片描述

代码

class Solution {
public List<List> levelOrder(TreeNode root) {
if (root == null) return new ArrayList<>();
Queue queue = new LinkedList<>();
List<List> ans = new ArrayList<>();
queue.offer(root);
while (!queue.isEmpty()) {
int n = queue.size();
List list = new ArrayList<>();
for (int i = 0; i < n; i++) {
TreeNode node = queue.poll();
list.add(node.val);
if (node.left != null) queue.offer(node.left);
if (node.right != null) queue.offer(node.right);
}
ans.add(list);
}
return ans;
}
}

108.将有序数组转换为二叉树

题目

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵平衡二叉搜索树。
在这里插入图片描述

代码

class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return sortedArrayToBST(nums, 0, nums.length - 1);
}

public TreeNode sortedArrayToBST(int[] nums, int left, int right) {
    if (left > right) return null;
    else if (left == right) return new TreeNode(nums[left]);
    else {
        int mid = (right - left >> 1) + left;
        TreeNode lchild = sortedArrayToBST(nums, left, mid - 1);
        TreeNode rchild = sortedArrayToBST(nums, mid + 1, right);
        return new TreeNode(nums[mid], lchild, rchild);
    }
}

}

98.验证二叉搜索树

题目

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

代码

class Solution {
public boolean isValidBST(TreeNode root) {
return isValidBST(root, 0, 0, false, false);
}

public boolean isValidBST(TreeNode root, int down, int up, boolean downExist, boolean upExist) {
    if (root == null) return true;
    if (downExist && root.val <= down) return false;
    if (upExist && root.val >= up) return false;
    boolean left = isValidBST(root.left, down, root.val, downExist, true);
    boolean right = isValidBST(root.right, root.val, up, true, upExist);
    return left && right;
}

}

230.二叉搜索树中第K小的元素

题目

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。
在这里插入图片描述思路:取中序遍历序列的下标为k-1的数。中序遍历,每遍历一个结点,计数+1,当计数为k时恰好为第k小的元素,递归中序遍历版,缺点是,相比于迭代遍历,下面的代码会遍历整棵树

代码

class Solution {
int count = 0;
int ans;

public int kthSmallest(TreeNode root, int k) {
    if (root == null) return 0;
    kthSmallest(root.left, k);
    count++;
    if (count == k) ans = root.val;
    kthSmallest(root.right, k);
    return ans;
}

}

199.二叉树的右视图

题目

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
在这里插入图片描述

代码

class Solution {
public List rightSideView(TreeNode root) {
if (root == null) return new ArrayList<>();
Queue queue = new LinkedList<>();
List ans = new ArrayList<>();
queue.offer(root);
while (!queue.isEmpty()) {
int n = queue.size();
for (int i = 0; i < n; i++) {
TreeNode node = queue.poll();
if (node.left != null) queue.offer(node.left);
if (node.right != null) queue.offer(node.right);
if (i == n - 1) ans.add(node.val);
}
}
return ans;
}
}

相关文章:

  • AI大模型的文本流如何持续吐到前端,实时通信的技术 SSE(Server-Sent Events) 认知
  • Testin云测(兼容性测试)
  • [Spring Boot] Expense API 实现
  • Docker-数据卷
  • 合并多次commit记录
  • 股票数据接口API实例代码python、JAVA等多种语言演示免费获取实时数据、历史数据、CDMA、KDJ等指标数据配有API说明文档
  • 求矩阵对角线元素的最大值
  • 机器视觉3D工业相机机器视觉检测的优缺点
  • 解决前后端日期传输因时区差异导致日期少一天的问题
  • 【c++】【Linux】【进程】线程终止/崩溃 会导致进程终止/崩溃 吗?
  • 【油漆面积——线段树,扫描线,不用pushdown的特例,pushup兼有cal的性质】
  • 大数据如何帮助你在业务中创造奇迹?
  • 【HarmonyOS Next】图片选择方案
  • 精选Python小项目代码
  • 【前端框架】深入探讨 Vue 3 组件生命周期的变化和最佳实践
  • 卓越设计彰显品质:福特中国“烈马宇宙”项目展示高质量标准
  • linux--关于GCC、动态库静态库
  • kubectl exec 实现的原理
  • 【SQL技术】不同数据库引擎 SQL 优化方案剖析
  • 30天自制操作系统第一天(1)
  • 全国省市县国土空间总体规划已基本批复完成,进入全面实施阶段
  • 国税总局上海市税务局通报:收到王某对刘某某及相关企业涉税问题举报,正依法依规办理
  • 泽连斯基与埃尔多安会面,称已决定派遣代表团前往伊斯坦布尔
  • 中国证券业协会修订发布《证券纠纷调解规则》
  • 通化市委书记孙简升任吉林省副省长
  • 沈阳卫健委通报“健康证”办理乱象:涉事医院已被立案查处