力扣解题思路:513. 找树左下角的值

513. 找树左下角的值


思路:给定一个二叉树,在树的最后一行找到最左边的值。例如:

Input:

        1
       / \
      2   3
     /   / \
    4   5   6
       /
      7

Output:
7

很显然,这题可以用DFS和BFS来解题,但是由于所求是最后一行的最左边的值,那么最合适的是采用层次遍历树,也就是BFS遍历树。
(方法1:BFS)我们在遍历树的每一层的时候用一个列表来保存每一层的节点的值,每次遍历一层前,清除掉之前列表中的值,那么在退出循环后列表中保存的就是最后一层的数据了,我们取出列表最后一个值就是最后结果啦ヾ(≧▽≦*)o,完整代码如下:

public int findBottomLeftValue(TreeNode root) {
    List<Integer> list = new ArrayList<>();
    if(root == null) return 0;
    Queue<TreeNode> queue = new LinkedList<>();
    queue.add(root);
    while(!queue.isEmpty()){
        int size = queue.size();
        list.clear();
        for(int i=0;i<size;i++){
            TreeNode node = queue.poll();
            list.add(node.val);
            if (node.right != null) queue.offer(node.right);
            if (node.left != null) queue.offer(node.left);
        }
    }
    return list.get(list.size()-1);
}

还要注意的一点是,入队列的顺序不可以颠倒哦,先是右边入队再左边,这样取出最后一个才会是左边哦,或者也可以左边先入队再右边,这样列表第一个值也是我们的答案啦~~
但是我看了下,发现这个代码好冗余呀,可不可以把他简化一点呢,因为整个列表其实有用的就只有最后一个值,那我们完全可以用root直接来保存最后一个几点呀,甚至都不用一层层的便利了,因为最后一个便利的一定最左节点了呀(因为是从右到左入队),改进后的代码如下:

public int findBottomLeftValue(TreeNode root) {
    Queue<TreeNode> queue = new LinkedList<>();
    queue.add(root);
    while (!queue.isEmpty()) {
        root = queue.poll();
        if (root.right != null) queue.add(root.right);
        if (root.left != null) queue.add(root.left);
    }
    return root.val;
}

写完BFS当然也要挑战一下DFS呀,DFS与之不同的是要维护一个层数的最大值和每层的最右节点,这样每次遇到更大的层数时,更新这个最右节点直到退出递归:

int max = Integer.MIN_VALUE;    
int res;    
public int findBottomLeftValue(TreeNode root){        
    dfs(root,0);        
    return res;    
}    
public void dfs(TreeNode node, int depth){        
    if(node == null) return ;        
    if(node!=null){            
    	if(node.left == null && node.right == null){                
    		if(max < depth){                    
    			max = depth;                    
    			res = node.val;                
    		}            
    	}            
    dfs(node.left,depth+1);            
    dfs(node.right,depth+1);
    }    
} 

这里也是一样的道理,先判断的一定是每层的第一个节点,为什么呢,因为先调用dfs的时node.left,所以第一个被判断层数的是最左节点,这样res中保存的值就是答案啦~

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值