c语言sscanf函数的用法是什么
257
2022-08-24
手撸二叉树之第二小的节点
今天给大家带来的关于二叉树相关的算法题是二叉树中第二小的节点,正文如下:
题目
给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么该节点的值等于两个子节点中较小的一个。
更正式地说,root.val = min(root.left.val, root.right.val) 总成立。
给出这样的一个二叉树,你需要输出所有节点中的第二小的值。如果第二小的值不存在的话,输出 -1 。
示例1
输入:root = [2,2,5,null,null,5,7]输出:5解释:最小的值是 2 ,第二小的值是 5
示例2
输入:root = [2,2,2]输出:-1解释:最小的值是 2, 但是不存在第二小的值。
解题思路
我们可以使用深度优先搜索的方法对二叉树进行遍历,根据题意可知,根节点 root 的值为二叉树最小的值,所以我们只需要找到比 root.val 大的最小值,即可找到所有节点中的第二小的值。
所以我们先定义一个结果值为 ans, 并初始化为 Integer.MAX_VALUE,在遍历过程中,结合每个子节点的数量要么是 0 要么是 2,以及 root.val = min(root.left.val, root.right.val) 的性质,只要找到节点的值小于 ans,就对 ans 进行更新。
另外,如果当前节点的值大于等于 ans, 根据该二叉树的性质 root.val = min(root.left.val, root.right.val) ,以当前节点为根的子树中所有节点的值都大于等于 ans,我们就直接回溯,无需对该子树进行遍历。
代码实现
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */class Solution { int ans = Integer.MAX_VALUE; boolean find = false; public int findSecondMinimumValue(TreeNode root) { if (root.left == null) return -1; int val = root.val; helper(root, val); return !find ? -1 : ans; } public void helper(TreeNode r, int { if (r == null) return ; if (r.val != val) { ans = Math.min(r.val, ans); find = true; return; } helper(r.left, val); helper(r.right, val); }}
最后
复杂度分析
时间复杂度:O(n),其中 n 是二叉树中的节点个数。我们最多需要对整棵二叉树进行一次遍历。空间复杂度:O(n)。我们使用深度优先搜索的方法进行遍历,需要使用的栈空间为 O(n)。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~