This commit is contained in:
zhangsan 2025-03-18 12:34:17 +08:00
parent b9c0de8d1b
commit 0d237e047c
9 changed files with 298 additions and 0 deletions

View File

@ -0,0 +1,33 @@
package tree;
/**
* 题目 543. 二叉树的直径 (diameterOfBinaryTree)
* 描述给你一棵二叉树的根节点返回该树的 直径
* 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 这条路径可能经过也可能不经过根节点 root
* 两节点之间路径的 长度 由它们之间边数表示
* 链接https://leetcode.cn/problems/diameter-of-binary-tree/
*/
public class DiameterOfBinaryTree {
private int maxDiameter = 0;
public int diameterOfBinaryTree(TreeNode root) {
depth(root);
return maxDiameter;
}
// 递归函数返回以 node 为根的树的深度
private int depth(TreeNode node) {
if (node == null) {
return 0;
}
int leftDepth = depth(node.left);
int rightDepth = depth(node.right);
// 直径为左子树深度+右子树深度
maxDiameter = Math.max(maxDiameter, leftDepth + rightDepth);
// 返回当前树的深度
return Math.max(leftDepth, rightDepth) + 1;
}
}

View File

@ -0,0 +1,34 @@
package tree;
/**
* 题目 226. 翻转二叉树 (invertTree)
* 描述给你一棵二叉树的根节点 root 翻转这棵二叉树并返回其根节点
* 链接https://leetcode.cn/problems/invert-binary-tree/
*/
public class InvertTree {
public void invert(TreeNode root){
if(root!=null){
TreeNode temp;
temp=root.left;
root.left=root.right;
root.right=temp;
invert(root.left);
invert(root.right);
}
}
public TreeNode invertTree1(TreeNode root) {
invert(root);
return root;
}
public TreeNode invertTree(TreeNode root) {
if (root == null) {
return null;
}
TreeNode left = invertTree(root.left);
TreeNode right = invertTree(root.right);
root.left = right;
root.right = left;
return root;
}
}

View File

@ -0,0 +1,80 @@
package tree;
import java.util.LinkedList;
import java.util.Queue;
/**
* 题目 101. 对称二叉树 (invertTree)
* 描述给你一个二叉树的根节点 root 检查它是否轴对称
* 链接https://leetcode.cn/problems/symmetric-tree/
*/
//不会做递归和迭代都写一下
public class IsSymmetric {
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) {
return false;
}
// 判断两个节点的值是否相等并递归判断
// 1. 左子树的左子树和右子树的右子树是否镜像
// 2. 左子树的右子树和右子树的左子树是否镜像
return (left.val == right.val)
&& isMirror(left.left, right.right)
&& isMirror(left.right, right.left);
}
public boolean isSymmetric1(TreeNode root) {
if (root == null) {
return true;
}
// 使用队列来存储成对的节点进行比较
Queue<TreeNode> queue = new LinkedList<>();
// 将根节点的左右子节点放入队列
queue.offer(root.left);
queue.offer(root.right);
while (!queue.isEmpty()) {
// 每次从队列中取出两个节点进行比较
TreeNode left = queue.poll();
TreeNode right = queue.poll();
// 如果两个节点均为空说明这一对对称继续下一对
if (left == null && right == null) {
continue;
}
// 如果只有一个为空或者两个节点的值不相等则不是对称树
if (left == null || right == null || left.val != right.val) {
return false;
}
// 将左右节点的子节点按照对称顺序加入队列
// 1. 左子节点的左子树和右子节点的右子树
// 2. 左子节点的右子树和右子节点的左子树
queue.offer(left.left);
queue.offer(right.right);
queue.offer(left.right);
queue.offer(right.left);
}
// 遍历完所有节点对后没有发现不对称的情况
return true;
}
}

View File

@ -0,0 +1,17 @@
package tree;
/**
* 题目 98. 验证二叉搜索树 (isValidBST)
* 描述给你一个二叉树的根节点 root 判断其是否是一个有效的二叉搜索树
* 有效 二叉搜索树定义如下
* 节点的左子树只包含 小于 当前节点的数
* 节点的右子树只包含 大于 当前节点的数
* 所有左子树和右子树自身必须也是二叉搜索树
* 链接https://leetcode.cn/problems/validate-binary-search-tree/
*/
public class IsValidBST {
public boolean isValidBST(TreeNode root) {
return false;
}
}

View File

@ -0,0 +1,39 @@
package tree;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
/**
* 题目 102. 二叉树的层序遍历 (levelOrder)
* 描述给你二叉树的根节点 root 返回其节点值的 层序遍历 即逐层地从左到右访问所有节点
* 链接https://leetcode.cn/problems/binary-tree-level-order-traversal/
*/
public class LevelOrder {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>>res=new ArrayList<>();
if(root==null)
return new ArrayList<>();
Queue<TreeNode>queue=new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()){
int levelSize = queue.size();
List<Integer>list=new ArrayList<>();
for (int i = 0; i < levelSize; i++) {
TreeNode tp=queue.poll();
list.add(tp.val);
if(tp.left!=null) {
queue.offer(tp.left);
}
if(tp.right!=null) {
queue.offer(tp.right);
}
}
res.add(list);
}
return res;
}
}

View File

@ -0,0 +1,57 @@
package tree;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
/**
* 题目 104. 二叉树的最大深度 (maxDepth)
* 描述给定一个二叉树 root 返回其最大深度
* 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数
* 链接https://leetcode.cn/problems/maximum-depth-of-binary-tree/
*/
public class MaxDepth {
//递归
int dfs(TreeNode root){
if(root==null)
return 0;
return Integer.max(dfs(root.left),dfs(root.right))+1;
}
public int maxDepth1(TreeNode root) {
return dfs(root);
}
//bfs
public int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int depth = 0;
// 每次while循环处理一层节点
while (!queue.isEmpty()) {
int levelSize = queue.size(); // 当前层节点数量
// 遍历当前层所有节点
for (int i = 0; i < levelSize; i++) {
TreeNode node = queue.poll();
// 如果存在左子节点则加入队列
if (node.left != null) {
queue.offer(node.left);
}
// 如果存在右子节点则加入队列
if (node.right != null) {
queue.offer(node.right);
}
}
// 每处理完一层深度加1
depth++;
}
return depth;
}
}

View File

@ -0,0 +1,23 @@
package tree;
/**
* 题目 108. 将有序数组转换为二叉搜索树 (sortedArrayToBST)
* 描述给你一个整数数组 nums 其中元素已经按 升序 排列请你将其转换为一棵 平衡 二叉搜索树
* 链接https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/
*/
public class SortedArrayToBST {
//分治
TreeNode func(int left,int right ,int[] nums){
if(left>right)
return null;
int mid=(right+left)/2;
TreeNode root=new TreeNode(nums[mid]);
root.left=func(left,mid-1,nums);
root.right=func(mid+1,right,nums);
return root;
}
public TreeNode sortedArrayToBST(int[] nums) {
return func(0,nums.length-1,nums);
}
}

View File

@ -0,0 +1,15 @@
package tree;
import org.junit.Test;
import static org.junit.Assert.*;
public class SortedArrayToBSTTest {
@Test
public void sortedArrayToBST() {
int[]nums = {-10,-3,0,5,9};
SortedArrayToBST solution = new SortedArrayToBST();
solution.sortedArrayToBST(nums);
}
}