首页 > 试题广场 >

二叉树的最小深度

[编程题]二叉树的最小深度
  • 热度指数:3679 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一颗节点数为N的叉树,求其最小深度。最小深度是指树的根节点到最近叶子节点的最短路径上节点的数量。
(注:叶子点是指没有子点的节点。)

数据范围:
0<=N<=6000
0<=val<=100

你能使用时间复杂度为O(N),空间复杂度为O(logN)的解法通过本题吗?

例如当输入{1,2,3,4,5}时,对应的二叉树如下图所示:
可以看出离根节点最近的叶子节点是节点值为3的节点,所以对应的输出为2。
示例1

输入

{1,2,3,4,5}

输出

2
示例2

输入

{1,#,2,#,3}

输出

3

说明:本题目包含复杂数据结构TreeNode,点此查看相关信息
/**
 * #[derive(PartialEq, Eq, Debug, Clone)]
 * pub struct TreeNode {
 *     pub val: i32,
 *     pub left: Option<Box<TreeNode>>,
 *     pub right: Option<Box<TreeNode>>,
 * }
 *
 * impl TreeNode {
 *     #[inline]
 *     fn new(val: i32) -> Self {
 *         TreeNode {
 *             val: val,
 *             left: None,
 *             right: None,
 *         }
 *     }
 * }
 */
struct Solution{

}

impl Solution {
    fn new() -> Self {
        Solution{}
    }

    /**
    * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    *
    * 
        * @param root TreeNode类 
        * @return int整型
    */
    pub fn run(&self, root: Option<Box<TreeNode>>) -> i32 {
        // write code here
        Self::depth_first_traversal(&root, 0).unwrap()
    }

    fn depth_first_traversal(node: &Option<Box<TreeNode>>, depth: i32) -> Option<i32> {
        if node.is_none() {return Some(depth)}

        if node.as_ref()?.left.is_none() && node.as_ref()?.right.is_none() {
            return Some(depth + 1);
        }

        use std::cmp::min;
        use std::i32::MAX;
        Some(min(
            if node.as_ref()?.left.is_some() {
                Self::depth_first_traversal(&node.as_ref()?.left, depth + 1)?
            } else {
                MAX
            },
            if node.as_ref()?.right.is_some() {
                Self::depth_first_traversal(&node.as_ref()?.right, depth + 1)?
            } else {
                MAX
            },
        ))
    }
}

发表于 2023-08-31 10:14:54 回复(0)