树
104. 二叉树的最大深度
题解:
/**
* 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 {
public int maxDepth(TreeNode root) {
return dfs(root);
}
private int dfs(TreeNode root) {
if (null == root) {
return 0;
}
return Math.max(dfs(root.left), dfs(root.right)) + 1;
}
}
111. 二叉树的最小深度
错误解法:
class Solution {
public int minDepth(TreeNode root) {
if (null == root) {
return 0;
}
if (null == root.left && null == root.right) {
return 1;
}
int leftStep = minDepth(root.left);
int rightStep = minDepth(root.right);
return Math.min(leftStep, rightStep) + 1;
}
}
正确解法:
1.自底向上
class Solution {
public int minDepth(TreeNode root) {
if (null == root) {
return 0;
}
if (null == root.left && null == root.right) {
return 1;
}
int leftStep = minDepth(root.left);
if (null == root.right) {
return leftStep + 1;
}
int rightStep = minDepth(root.right);
if (null == root.left) {
return rightStep + 1;
}
return Math.min(leftStep, rightStep) + 1;
}
}
2.自顶向下
class Solution {
private int ans = Integer.MAX_VALUE;
public int minDepth(TreeNode root) {
if (null == root) {
return 0;
}
dfs(root, 1);
return ans;
}
private void dfs(TreeNode root, int step) {
if (null == root) {
return;
}
if (null == root.left && null == root.right) {
ans = Math.min(ans, step);
return;
}
dfs(root.left, step + 1);
dfs(root.right, step + 1);
}
}
112. 路径总和
题解:
class Solution {
public boolean hasPathSum(TreeNode root, int targetSum) {
return dfs(root, targetSum);
}
private boolean dfs(TreeNode root, int targetSum) {
if (null == root) {
return false;
}
if (null == root.left && null == root.right) {
if (targetSum == root.val) {
return true;
} else {
return false;
}
}
int temp = targetSum - root.val;
return dfs(root.left, temp) || dfs(root.right, temp);
}
}
113. 路径总和 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 Solution {
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
Deque<Integer> path = new ArrayDeque<>();
List<List<Integer>> res = new ArrayList<>();
dfs(root, targetSum, path, res);
return res;
}
private void dfs(TreeNode root, int targetSum, Deque<Integer> path, List<List<Integer>> res) {
if (null == root) {
return;
}
if (null == root.left && null == root.right && root.val == targetSum) {
path.addLast(root.val);
res.add(new ArrayList<>(path));
path.removeLast();
return;
}
int temp = targetSum - root.val;
path.addLast(root.val);
dfs(root.left, temp, path, res);
dfs(root.right, temp, path, res);
path.removeLast();
}
}
437. 路径总和 III
题解:
/**
* 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 {
public int pathSum(TreeNode root, int targetSum) {
int res = 0;
if (null == root) {
return res;
}
// 易错
res = rootSum(root, (long)targetSum) + pathSum(root.left, targetSum) + pathSum(root.right, targetSum);
return res;
}
private int rootSum(TreeNode root, long targetSum) {
int res = 0;
if (null == root) {
return res;
}
long val = (long)root.val;
if (val == targetSum) {
res ++;
}
res += rootSum(root.left, targetSum - val);
res += rootSum(root.right, targetSum - val);
return res;
}
}
226. 翻转二叉树
题解:
/**
* 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 {
public TreeNode invertTree(TreeNode root) {
return dfs(root);
}
private TreeNode dfs(TreeNode root) {
if (null == root) {
return null;
}
TreeNode leftNode = dfs(root.left);
TreeNode rightNode = dfs(root.right);
root.left = rightNode;
root.right = leftNode;
return root;
}
}
100. 相同的树
题解:
/**
* 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 {
public boolean isSameTree(TreeNode p, TreeNode q) {
return dfs(p, q);
}
private boolean dfs(TreeNode p, TreeNode q) {
if (null == p && null == q) {
return true;
}
if (null == p) {
return false;
}
if (null == q) {
return false;
}
if (p.val != q.val) {
return false;
}
return dfs(p.left, q.left) && dfs(p.right, q.right);
}
}
101. 对称二叉树
题解:
/**
* 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 {
public boolean isSymmetric(TreeNode root) {
return isSymmetricTwo(root.left, root.right);
}
private boolean isSymmetricTwo(TreeNode root1, TreeNode root2) {
if (null == root1 && null == root2) {
return true;
}
if (null == root1) {
return false;
}
if (null == root2) {
return false;
}
if (root1.val != root2.val) {
return false;
}
return isSymmetricTwo(root1.left, root2.right) && isSymmetricTwo(root1.right, root2.left);
}
}
129. 求根节点到叶节点数字之和
题解:
/**
* 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 sum = 0;
public int sumNumbers(TreeNode root) {
dfs(root);
return sum;
}
private void dfs(TreeNode root) {
if (null == root.left && null == root.right) {
sum += root.val;
return;
}
if (null != root.left) {
root.left.val += (root.val * 10);
dfs(root.left);
}
if (null != root.right) {
root.right.val += (root.val * 10);
dfs(root.right);
}
}
}
236. 二叉树的最近公共祖先
题解:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (null == root || p == root || q == root) {
return root;
}
TreeNode leftNode = lowestCommonAncestor(root.left, p, q);
TreeNode rightNode = lowestCommonAncestor(root.right, p, q);
if (null != leftNode && null != rightNode) {
return root;
}
return leftNode == null ? rightNode : leftNode;
}
}
105. 从前序与中序遍历序列构造二叉树
题解:
/**
* 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 {
public TreeNode buildTree(int[] preorder, int[] inorder) {
return dfs(preorder, inorder);
}
private TreeNode dfs(int[] preorder, int[] inorder) {
final int preLen = preorder.length;
final int inLen = inorder.length;
if (0 == preLen && 0 == inLen) {
return null;
}
int val = preorder[0];
int index = findIndex(inorder, val);
TreeNode root = new TreeNode(val);
TreeNode leftNode = dfs(Arrays.copyOfRange(preorder, 1, 1 + index),
Arrays.copyOfRange(inorder, 0, index));
TreeNode rightNode = dfs(Arrays.copyOfRange(preorder, 1 + index, preLen),
Arrays.copyOfRange(inorder, index + 1, inLen));
root.left = leftNode;
root.right = rightNode;
return root;
}
private int findIndex(int[] inorder, int target) {
final int n = inorder.length;
for (int i = 0; i < n; i ++) {
if (target == inorder[i]) {
return i;
}
}
return -1;
}
}
106. 从中序与后序遍历序列构造二叉树
题解:
/**
* 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 {
public TreeNode buildTree(int[] inorder, int[] postorder) {
return dfs(inorder, postorder);
}
private TreeNode dfs(int[] inorder, int[] postorder) {
final int m = inorder.length;
final int n = postorder.length;
if (0 == n && 0 == m) {
return null;
}
int val = postorder[n - 1];
TreeNode root = new TreeNode(val);
int index = findIndex(inorder, val);
TreeNode leftNode = dfs(Arrays.copyOfRange(inorder, 0, index),
Arrays.copyOfRange(postorder, 0, index));
TreeNode rightNode = dfs(Arrays.copyOfRange(inorder, index + 1, m),
Arrays.copyOfRange(postorder, index, n - 1));
root.left = leftNode;
root.right = rightNode;
return root;
}
private int findIndex(int[] inorder, int target) {
final int n = inorder.length;
for (int i = 0; i < n; i ++) {
if (target == inorder[i]) {
return i;
}
}
return -1;
}
}
1008. 前序遍历构造二叉搜索树
题解:
/**
* 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 {
public TreeNode bstFromPreorder(int[] preorder) {
return dfs(preorder);
}
private TreeNode dfs(int[] preorder) {
final int n = preorder.length;
if (0 == n) {
return null;
}
if (1 == n) {
return new TreeNode(preorder[0]);
}
int val = preorder[0];
int index = findIndex(preorder);
TreeNode leftNode = dfs(Arrays.copyOfRange(preorder, 1, index));
TreeNode rightNode = dfs(Arrays.copyOfRange(preorder, index, n));
TreeNode root = new TreeNode(val);
root.left = leftNode;
root.right = rightNode;
return root;
}
private int findIndex(int[] preorder) {
final int n = preorder.length;
for (int i = 1; i < n; i ++) {
if (preorder[i] > preorder[0]) {
return i;
}
}
return n;
}
}