- 代码随想录:代码随想录
- 力扣:力扣 (LeetCode) 全球极客挚爱的技术成长平台
目录
01、代码随想录
00、其他
ArrayList转数组
ArrayList<Integer> arrayList = new ArrayList<>();
//将 ArrayList 转换为 int数组
int[] intArray = list.stream().mapToInt(Integer::intValue).toArray();
ArrayList<String> arrayList = new ArrayList<>();
//将 ArrayList 转换为 String数组
String[] stringArray = arrayList.toArray(new String[0]);
07、二叉树
7.0、递归法
解决二叉树题目,应该优先使用递归法。
- 确定递归函数的参数和返回值;
- 确定终止条件;
- 确定单层递归的逻辑。
代码随想录,二叉树:总结篇!
在每一道二叉树的题目中,我都使用了递归三部曲来分析题目,相信大家以后看到二叉树,看到递归,都会想:返回值、参数是什么?终止条件是什么?单层逻辑是什么?
7.1、二叉树的层序遍历模板
/**
* 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 Solution0102 {//力扣102.二叉树的层序遍历
public List<List<Integer>> levelOrder(TreeNode root) {
Deque<TreeNode> deque = new LinkedList<>();
if (root != null) {
deque.push(root);
}
List<List<Integer>> res = new ArrayList<List<Integer>>();
while (!deque.isEmpty()) {
int size = deque.size();
ArrayList<Integer> tempList = new ArrayList<Integer>();
while (size-- > 0) {//for (int i = 0; i < size; i++) {//fori操作空间更大,513题-找树左下角的值
TreeNode treeNode = deque.poll();
tempList.add(treeNode.val);
if (treeNode.left != null) {
deque.offer(treeNode.left);
}
if (treeNode.right != null) {
deque.offer(treeNode.right);
}
}
res.add(tempList);
}
return res;
}
}
import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
class Solution0617_1 {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
if (root1 == null) {
return root2;
} else if (root2 == null) {
return root1;
} else if (root1 == null && root2 == null) {
return null;
}
Deque<TreeNode> deque = new LinkedList<>();
deque.offer(root1);
deque.offer(root2);
while (!deque.isEmpty()) {
TreeNode poll1 = deque.poll();
TreeNode poll2 = deque.poll();
poll1.val += poll2.val;
if (poll1.left != null && poll2.left != null) {
deque.offer(poll1.left);
deque.offer(poll2.left);
}
if (poll1.right != null && poll2.right != null) {
deque.offer(poll1.right);
deque.offer(poll2.right);
}
if (poll1.left == null && poll2.left != null) {
poll1.left = poll2.left;
}
if (poll1.right == null && poll2.right != null) {
poll1.right = poll2.right;
}
}
return root1;
}
}
7.2、判断两棵树是否相同
/**
* 判断两棵树是否相同
*/
public boolean isSameTree(TreeNode s, TreeNode t) {
if (s == null && t == null) {
return true;
}
if (s == null || t == null) {
return false;
}
if (s.val != t.val) {
return false;
}
return isSameTree(s.left, t.left) && isSameTree(s.right, t.right);
}
7.3、求二叉树高度
public int getHeight(TreeNode root) {
if (root == null) {
return 0;
} else {
int leftHeight = maxDepth(root.left);
int rightHeight = maxDepth(root.right);
return Math.max(leftHeight, rightHeight) + 1;
}
}
7.4、二叉树路径和相关题目
- 257.二叉树的所有路径
- 112.路径总和
- 113.路径总和II
package com.question.solve.leetcode.programmerCarl2._07_binaryTrees;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;
public class _0113_路径总和II {
}
/**
* 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 Solution0113 {
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
List<List<Integer>> res = new ArrayList<>();
if (root == null) return res;//非空判断
List<Integer> paths = new ArrayList<>();
traversal(root, targetSum, res, paths);
return res;
}
private void traversal(TreeNode root, int targetSum, List<List<Integer>> res, List<Integer> paths) {
if (root == null) {
return;
}
paths.add(root.val);
if (root.left == null && root.right == null) {//遇到了叶子节点
//int sum = paths.stream().mapToInt(Integer::intValue).sum();
int sum = paths.stream().mapToInt(x -> x).sum();
if (targetSum == sum) {//找到了和为targetSum的路径
res.add(new ArrayList<>(paths));
}
return;//如果和不为targetSum,返回
}
if (root.left != null) {
traversal(root.left, targetSum, res, paths);
paths.remove(paths.size() - 1);//回溯
}
if (root.right != null) {
traversal(root.right, targetSum, res, paths);
paths.remove(paths.size() - 1);//回溯
}
}
}
7.5、根据数组构造二叉树
- 106.从中序与后序遍历序列构造二叉树
- 105.从前序与中序遍历序列构造二叉树
- 654.最大二叉树
- 108. 将有序数组转换为二叉搜索树
7.6、DFS与BFS
package com.question.solve.leetcode.programmerCarl._07binaryTrees;
import java.util.LinkedList;
import java.util.Queue;
public class BinaryTreeSearch {
public static void main(String[] args) {
//构建一个二叉树
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
root.right.left = new TreeNode(6);
root.right.right = new TreeNode(7);
BinaryTreeSearch searcher = new BinaryTreeSearch();
System.out.println("深度优先搜索结果:");
searcher.dfs(root);
System.out.println("\n广度优先搜索结果:");
searcher.bfs(root);
}
public void dfs(TreeNode root) {//深度优先搜索(DFS)
if (root == null) {
return;
}
System.out.print(root.val + " ");//先访问当前节点
dfs(root.left);//递归遍历左子树
dfs(root.right);//递归遍历右子树
}
public void bfs(TreeNode root) {//广度优先搜索(BFS)
if (root == null) {
return;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
System.out.print(no