二叉树最底层最左边的值

496 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第30天,点击查看活动详情

一、题目

LeetCode 二叉树最底层最左边的值

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

假设二叉树中至少有一个节点。

示例 1:

输入: root = [2,1,3]
输出: 1

示例 2:

输入: [1,2,3,4,null,5,6,null,null,7]
输出: 7

提示:

二叉树的节点个数的范围是 [1,104]
-231 <= Node.val <= 231 - 1 

二、题解

需要找到给定二叉树中最深层节点中最左边的节点值,二叉树最少含有一个节点。

方法一

对此可以遍历二叉树节点来寻找,首先可以通过dfs深度优先搜索遍历,遍历就使用先遍历左子树节点再遍历右子树节点的方式,遍历过程中记录需要记录最大层级和最左节点值。具体的使用dfs递归遍历二叉树,参数需要一个树的根节点root和当前遍历节点的层级level,同时需要维护最大层级maxLevel和最左节点值val,遍历过程中实时更新最大层级maxLevel和最左节点值val。递归判断遍历的根节点root为空的话就结束,然后递归遍历之前先给当前层级level加一,然后递归的遍历左子树和右子树节点,最后判断节点层级,如果当前层级大于记录的最大层级,说明新遍历到了一层节点,那就记录当前遍历的节点值为最左节点值,同时更新最大层级就好了。

方法二

同时也可以使用bfs深度优先搜索遍历二叉树节点,需要使用队列辅助遍历,每次队列存储的节点都是同一层的节点,然后取出节点将节点的右子树加入到队列,然后再加入左子树到队列中,这样一直遍历到最后的一个节点就是最底层最左边的节点,所以可以实时更新遍历的节点为最左节点值,这样最后遍历结束的记录返回即可。

三、代码

方法一 Java代码

class Solution {
    int val = 0;
    int maxLevel = 0;

    public int findBottomLeftValue(TreeNode root) {
        dfs(root, 0);
        return val;
    }

    public void dfs(TreeNode root, int level) {
        if (root == null) {
            return;
        }
        level++;
        dfs(root.left, level);
        dfs(root.right, level);
        if (level > maxLevel) {
            maxLevel = level;
            val = root.val;
        }
    }
}

时间复杂度:O(n),需要遍历二叉树节点。

空间复杂度:O(n),递归需要消耗的栈空间。


方法二 Java代码

class Solution {
    public int findBottomLeftValue(TreeNode root) {
        int val = 0;
        Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            if (node.right != null) {
                queue.offer(node.right);
            }
            if (node.left != null) {
                queue.offer(node.left);
            }
            val = node.val;
        }
        return val;
    }
}

时间复杂度:O(n),需要遍历二叉树节点。

空间复杂度:O(n),遍历需要队列辅助。