513 找树左下角的值
import java.util.LinkedList;
import java.util.Queue;
import programmer.day13.TreeNode;
// @lc code=start
/**
* 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 findBottomLeftValue(TreeNode root) {
// int ans = 0;
// Queue<TreeNode> queue = new LinkedList<>();
// queue.offer(root);
// while(!queue.isEmpty()){
// int size = queue.size();
// for(int i = 0; i < size; i++){
// TreeNode node = queue.poll();
// if(i == 0){
// ans = node.val;
// }
// if(node.left != null){
// queue.offer(node.left);
// }
// if(node.right != null){
// queue.offer(node.right);
// }
// }
// }
// return ans;
// }
private int DEEP = -1;
private int ans;
public int findBottomLeftValue(TreeNode root) {
depth(root, 0);
return ans;
}
private void depth(TreeNode node, int deep){
if(node == null){
return;
}
if(node.left == null && node.right == null && deep >DEEP){
DEEP = deep;
ans = node.val;
}
depth(node.left, deep + 1);
depth(node.right, deep + 1);
}
}
112. 路径总和
class Solution {
public boolean hasPathSum(TreeNode root, int targetSum) {
if(root == null){
return false;
}
return backtracing(root, targetSum, 0);
}
private boolean backtracing(TreeNode node, int target, int current){
current += node.val;
if(node.left == null && node.right == null){
return current == target;
}
if(node.left != null && backtracing(node.left, target, Integer.valueOf(current))){
return true;
}
if(node.right != null && backtracing(node.right, target, Integer.valueOf(current))){
return true;
}
return false;
}
}
113. 路径总和ii
import java.util.ArrayList;
import java.util.List;
/**
* 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 {
List<List<Integer>> ans;
List<Integer> path;
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
ans = new ArrayList<>();
path = new ArrayList<>();
if(root ==null){
return ans;
}
int current = root.val;
path.add(root.val);
backtracing(root, targetSum, current, path);
return ans;
}
private void backtracing(TreeNode node, int target, int current, List<Integer> path){
if(node.left == null && node.right == null && current == target){
ans.add(new ArrayList<>(path));
return;
}
if(node.left != null){
path.add(node.left.val);
backtracing(node.left, target, current + node.left.val, path);
path.remove(path.size() - 1);
}
if(node.right != null){
path.add(node.right.val);
backtracing(node.right, target, current + node.right.val, path);
path.remove(path.size() - 1);
}
}
}
106.从中序与后序遍历序列构造二叉树
class Solution {
public TreeNode buildTree(int[] inorder, int[] postorder) {
// 闭开区间
return buildTree(inorder, 0, inorder.length, postorder, 0, postorder.length);
}
private TreeNode buildTree(int[] inorder, int inStart, int inEnd, int[] postorder, int postStart, int postEnd){
if(inStart >= inEnd || postStart >= postEnd){
return null;
}
int val = postorder[postEnd - 1];
TreeNode root = new TreeNode(val);
int index = inStart;
for(int i = inStart; i < inEnd; i++){
if(inorder[i] == val){
index = i;
break;
}
}
root.left = buildTree(inorder, inStart, index, postorder, postStart, postStart + index - inStart);
root.right = buildTree(inorder, index + 1, inEnd, postorder, postEnd - inEnd +index, postEnd - 1);
return root;
}
}
105.从前序与中序遍历序列构造二叉树
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
// 闭开区间
return buildTree(preorder, 0, preorder.length, inorder, 0, inorder.length);
}
private TreeNode buildTree(int[] preorder, int preStart, int preEnd, int[] inorder, int inStart, int inEnd){
if(preStart >=preEnd || inStart >= inEnd){
return null;
}
int val = preorder[preStart];
TreeNode root = new TreeNode(val);
int inIndex = inStart;
for(int i = inStart; i < inEnd; i++){
if(inorder[i] == val){
inIndex = i;
break;
}
}
root.left = buildTree(preorder, preStart + 1, preStart + 1 + inIndex - inStart, inorder, inStart, inIndex);
root.right = buildTree(preorder, preEnd - inEnd + inIndex +1,preEnd, inorder, inIndex + 1, inEnd);
return root;
}
}