题目描述
给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。
假设二叉树中至少有一个节点。
题目示例
输入: root = [2,1,3]
输出: 1
解题思路
深度优先搜索
使用 depth 记录遍历到的节点的深度,result 记录深度在 depth 的最左节点的值。在深度优先搜索时,我们先搜索当前节点的左子节点,再搜索当前节点的右子节点,然后判断当前节点的深度 depth 是否大于 maxDepth,如果是,那么将 result 设置为当前结点的值,maxDepth 设置为 depth。
由于我们总是先遍历左节点,再遍历右节点,所以我们可以保证我们每一次更新的最大深度时总是在当前层中的最左侧,记录的是最大深度最左侧节点的值。
广度优先搜索
使用广度优先搜索遍历每一层的节点。在遍历一个节点时,需要先把它的非空右子节点放入队列,然后再把它的非空左子节点放入队列,这样才能保证从右到左遍历每一层的节点。广度优先搜索所遍历的最后一个节点的值就是最底层最左边节点的值。
参考代码
深度优先搜索
class Solution {public int maxDepth = Integer.MIN_VALUE;public int result;public int findBottomLeftValue(TreeNode root) {traversal(root, 0);return result;}public void traversal(TreeNode node, int depth) {// 如果是叶子结点if(node.left == null && node.right == null) {// 因为每一层是先看左再看右,所以第一个是最左边的// 判断是不是第一个遇到的叶子结点,代表是最左边的if(depth > maxDepth) {maxDepth = depth;result = node.val;return;}}if(node.left != null) {traversal(node.left, depth + 1);}if(node.right != null) {traversal(node.right, depth + 1);}}
}
广度优先搜索
class Solution {public int findBottomLeftValue(TreeNode root) {int ret = 0;Queue<TreeNode> queue = new ArrayDeque<TreeNode>();queue.offer(root);while (!queue.isEmpty()) {TreeNode p = queue.poll();if (p.right != null) {queue.offer(p.right);}if (p.left != null) {queue.offer(p.left);}ret = p.val;}return ret;}
}