Leetcode-day14-二叉树

找二叉树左下角的值

找树的最底层的最左边的值,思路是用层序遍历,然后找到最下层的第一个元素就可以

这里还是复习一下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. 从中序与后序遍历序列构造二叉树

 

 

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值