手撸二叉树之二叉树中第二小的节点
Hello, 大家好,今天是我参加 8 月更文的第 7 天,今天给大家带来的关于二叉树相关的算法题是求二叉树中第二小的节点,正文如下:
题目
给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么该节点的值等于两个子节点中较小的一个。
更正式地说,root.val = min(root.left.val, root.right.val) 总成立。
给出这样的一个二叉树,你需要输出所有节点中的第二小的值。如果第二小的值不存在的话,输出 -1 。
示例 1:
示例 2:
提示:
树中节点数目在范围 [1, 25] 内
1 <= Node.val <= 231 - 1
对于树中每个节点 root.val == min(root.left.val, root.right.val)
思路分析
根据题目意思,我们可以得出这样的结论:对于二叉树中的任意节点 x,x 的值不大于以 x 为根的子树中所有节点的值,所以说二叉树的根节点的值为所有节点中的最小值。
因此,我们可以对整棵二叉树进行遍历,找出比根节点大的最小值,即为所有节点中的第二小的值。
我们可以使用深度优先搜索的方法对二叉树进行遍历。
因为 root.val 是树中最小的,所以遍历到任何一个节点的 val ,都是严格大于 root.val 的。
当找到这样一些节点时,我们记录最小值。由于任意节点的 val 都是左右子树中的最小值,所以可以直接返回,不用继续递归搜索子树。
代码实现
最后
复杂度分析
时间复杂度:O(n),其中 n 是二叉树中的节点个数。我们最多需要对整棵二叉树进行一次遍历。
空间复杂度:O(n)。我们使用深度优先搜索的方法进行遍历,需要使用的栈空间为 O(n)。
版权声明: 本文为 InfoQ 作者【HelloWorld杰少】的原创文章。
原文链接:【http://xie.infoq.cn/article/bf9280a77a79dfe7d5a9a831c】。文章转载请联系作者。
评论