找二叉树左下角的值
找树的最底层的最左边的值,思路是用层序遍历,然后找到最下层的第一个元素就可以
这里还是复习一下java中deque的用法,其实用deque就可以实现了java中栈,单队列,双向队列
Deque<> deque = new LinkedList<>();
常用的API:
添加元素:addFirst() addLast() offerFirst() offerLast() offer的API是成功返回true,失败返回false
移除元素:removeFirst() removeLast() 对列为空就抛异常 pollFirst() pollLast() 队列为空返回null
访问元素:getFirst() getLast() 队列为空抛异常 peekFirst() peekLast() 队列为空返回null
size() 返回队列中元素的数量 isEmpty() contains()
class Solution {
public int findBottomLeftValue(TreeNode root) {
//思路:层序遍历,找最后一层的第一个元素
ArrayList<ArrayList<TreeNode>> arraylist = new ArrayList<>();
Deque<TreeNode> deque = new LinkedList<>();
deque.add(root);
while(!deque.isEmpty()){
int size = deque.size();
ArrayList<TreeNode> arr = new ArrayList<>();
while(size>0){
TreeNode node = deque.poll();
arr.add(node);
if(node.left!=null){
deque.add(node.left);
}
if(node.right!=null){
deque.add(node.right);
}
size--;
}
arraylist.add(arr);
}
return arraylist.get(arraylist.size()-1).get(0).val;
}
}
112. 路径总和
我这里直接用的前序+回溯找到所有的路径,然后看有没有满足题意的路径,二刷做其他算法的优化。
需要注意的是保存路径的时候res.add(new ArrayList<>(paths)); 要这样去做,不能直接res.add(paths),因为这样放的是一个引用,到后面回溯改了之后前面存放的paths就也被修改了,导致res中放的是同一条路径。
class Solution {
public boolean hasPathSum(TreeNode root, int targetSum) {
if(root==null){
return false;
}
List<Integer> paths = new ArrayList<>();
List<List<Integer>> res = new ArrayList<>();
dfs(root,paths,res);
for(List<Integer> path : res){
int sum=0;
for(int i : path){
sum+=i;
}
if(sum==targetSum){
return true;
}
}
return false;
}
public void dfs(TreeNode root,List<Integer> paths,List<List<Integer>> res){
paths.add(root.val);
if(root.left==null&&root.right==null){
res.add(new ArrayList<>(paths));
return;
}
if(root.left!=null){
dfs(root.left,paths,res);
paths.remove(paths.size()-1);
}
if(root.right!=null){
dfs(root.right,paths,res);
paths.remove(paths.size()-1);
}
}
}
106. 从中序与后序遍历序列构造二叉树