首页 > 其他分享 >LeetCode:111.二叉树的最小深度

LeetCode:111.二叉树的最小深度

时间:2025-01-12 16:55:54浏览次数:1  
标签:node map right length 111 二叉树 root LeetCode left

LeetCode:111.二叉树的最小深度

解题思路求最小深度,考虑使用广度优先遍历。在广度优先遍历过程中,遇到叶子节点,停止遍历,返回节点层级。

解题步骤广度优先遍历整棵树,并记录每个节点的层级。遇到叶子节点,返回节点层级,停止遍历。

//dfs
var minDepth = function(root) {
    if (!root) return 0;
    function dfs(node) {
        if (!node.left && !node.right) return 1; // 叶子节点,返回深度1
        let leftDepth = Infinity, rightDepth = Infinity;
        if (node.left) leftDepth = dfs(node.left);
        if (node.right) rightDepth = dfs(node.right);
        return Math.min(leftDepth, rightDepth) + 1;
    }
    return dfs(root);
};

var minDepth = function(root) {
    if (!root) return 0;
    let queue = [[root, 1]];
    while(queue.length) {
        let [n,length]=queue.shift();
        if(!n.left&&!n.right) return length;
        if(n.left){queue.push([n.left,length+1])}
        if(n.right){queue.push([n.right,length+1])}
    }
};
// time 2ms   space 83.99mb  O(n)

var minDepth = function(root) {
    if (!root) return 0;
    let queue = [{n:root,length:1}];
    while(queue.length) {
        let {n,length}=queue.shift();
        if(!n.left&&!n.right) return length;
        if(n.left){queue.push({n:n.left,length:length+1})}
        if(n.right){queue.push({n:n.right,length:length+1})}
    }
};
// time 4ms   space 83.96mb  O(n)

// time 7ms space 85.56mb
var minDepth = function(root) {
    if (!root) return 0;
    let s=Symbol('root')
    let map=new Map()
    map.set(s,{n:root,length:1})
    let key
    let n,length
    while(map.size>0) {
        key=Array.from(map.keys())[0]
        n=map.get(key).n
        length=map.get(key).length
        map.delete(key);
        if(!n.left&&!n.right) return length;
        if(n.left){map.set(Symbol(),{n:n.left,length:length+1})}
        if(n.right){map.set(Symbol(),{n:n.right,length:length+1})}
    }
};

//time 10ms  space 83.66mb
var minDepth = function(root) {
    if (!root) return 0;
    let s=Symbol('root')
    let map=new Map()
    let weakMap=new WeakMap()
    weakMap.set(s,{n:root,length:1})
    map.set(s,weakMap)
    let key
    let n,length
    while(map.size>0) {
        key=Array.from(map.keys())[0];
        n=map.get(key).get(key).n;
        length=map.get(key).get(key).length;
        map.delete(key);weakMap.delete(key);
        if(!n.left&&!n.right) return length;
        if(n.left){let l=Symbol();map.set(l,weakMap.set(l,{n:n.left,length:length+1}))}
        if(n.right){let r=Symbol();map.set(r,weakMap.set(r,{n:n.right,length:length+1}))}
    }
    map=null
    weakMap=null
};

//time 14ms  space 86mb
var minDepth = function(root) {
    if (!root) return 0;
    
    let minDepth = Infinity;
    
    function preorder(node, depth) {
        if (!node) return;
        
        // If it's a leaf node
        if (!node.left && !node.right) {
            minDepth = Math.min(minDepth, depth);
        }
        
        preorder(node.left, depth + 1);
        preorder(node.right, depth + 1);
    }
    
    preorder(root, 1);
    
    return minDepth;
};

//只用map 和 一个symbol 不通过....error simple
//可能只能3个symbol----
var minDepth = function(root) {
    if (!root) return 0;
    
    let s = Symbol('node');
    let map = new Map();
    map.set(s, { node: root, depth: 1 });
    
    while (map.size > 0) {
        let { node, depth } = map.get(s);
        map.delete(s);
        
        if (!node.left && !node.right) {
            return depth;
        }
        
        if (node.left) {
            map.set(s, { node: node.left, depth: depth + 1 });
        }
        
        if (node.right) {
            // If left child exists, we need to process it first
            if (!map.has(s)) {
                map.set(s, { node: node.right, depth: depth + 1 });
            }
        }
    }
};

6/3

标签:node,map,right,length,111,二叉树,root,LeetCode,left
From: https://www.cnblogs.com/KooTeam/p/18667051

相关文章

  • leetcode115 不同的子序列
    给定两个字符串s和t,统计并返回在s的子序列中t出现的个数,结果对1E9+7取模。1<=|s|,|t|<=1000分析:判断两字符串的最后一个字符:如果相同,则可以选择匹配或者不匹配;如果不同,则只能选择不匹配。初始条件:t为空时答案为1。mintdp[1005][1005];classSolution{public:intnumDi......
  • 代码随想录算法训练营第二天 | Leetcode 209、Leetcode 59、kama 44、kama 58
    Leetcode209#include"iostream"#include"vector"usingnamespacestd;intminSubArrayLen(inttarget,vector<int>&nums){intlen=INT32_MAX;intsum=0;for(intj=0,i=0;j<nums.size();j++){......
  • leetcode2585 获得分数的方法数
    考试中有n种类型的题目,给定整数target和二维数组types,其中types[i]=[count[i],marks[i]],表示第i种类型的题目有count[i]道,每道分值为marks[i]。求在考试中恰好得到target分的方法数,答案对1E9+7取模。注意,同类型题目无法区分。1<=target<=1000;1<=n<=50;1<=count[i],marks[i]<=5......
  • 数据结构与算法之二叉树: LeetCode 108. 将有序数组转换为二叉搜索树 (Ts版)
    将有序数组转换为二叉搜索树https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/描述给你一个整数数组nums,其中元素已经按升序排列请你将其转换为一棵平衡二叉搜索树示例1输入:nums=[-10,-3,0,5,9]输出:[0,-3,9,-10,nul......
  • 数据结构与算法之二叉树: LeetCode 110. 平衡二叉树 (Ts版)
    平衡二叉树https://leetcode.cn/problems/balanced-binary-tree/description/描述给定一个二叉树,判断它是否是平衡二叉树示例1输入:root=[3,9,20,null,null,15,7]输出:true示例2输入:root=[1,2,2,3,3,null,null,4,4]输出:false示例3输入:root=[]输......
  • 数据结构与算法之二叉树: LeetCode 117. 填充每个节点的下一个右侧节点指针 II (Ts版)
    填充每个节点的下一个右侧节点指针IIhttps://leetcode.cn/problems/populating-next-right-pointers-in-each-node-ii/description/描述给定一个二叉树:structNode{intval;Node*left;Node*right;Node*next;}填充它的每个next指针,让这个指针指向其......
  • LeetCode热题100中 35. 46. 70. 73. 118.
    35.搜索插入位置题目描述:实现思路:        这里主要就是二分查找,二分查找要注意对边界值的处理,l是数组的第一位,r是数组的最后一位,l<=r我们就返回l,因为我们的判断是nums[mid]<target 取的是mid的左区间已经不包含mid了,所以是 l=mid+1。代码:var......
  • 【LeetCode: 240. 搜索二维矩阵 II + 指针 + 遍历】
    ......
  • 【Java】二叉树:数据海洋中灯塔式结构探秘
    二叉树(BinaryTree)是一种基础且重要的树形数据结构,它是数据存储和操作的基础,广泛应用于各种场景,如数据库索引、图像处理、解析表达式等。在各种树形数据结构中,二叉树就像一座灯塔,引导我们在复杂的数据海洋中高效地进行数据处理。在本篇文章中,我们将深入探讨二叉树的基本......
  • LeetCode题练习与总结:复数乘法--537
    一、题目描述复数 可以用字符串表示,遵循 "实部+虚部i" 的形式,并满足下述条件:实部 是一个整数,取值范围是 [-100,100]虚部 也是一个整数,取值范围是 [-100,100]i^2==-1给你两个字符串表示的复数 num1 和 num2 ,请你遵循复数表示形式,返回表示它们乘积的字符串。......