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中保存的值就是答案啦~