题目来源:https://leetcode-cn.com/problems/second-minimum-node-in-a-binary-tree/
大致题意:
给定一个二叉树,二叉树的每个节点要么有两个子节点,要么没有子节点,且若有子节点,父节点的值为子节点中的较小值。(节点值大于0)
求出二叉树中次小值。
思路
可知父节点的值为子节点中较小值,那么根节点的值一定就是最小值。即对于所有的子树来说,其所有的子树根节点就是其最小值。
那么所要求的次小值,即为除去根节点的最小值。
DFS
使用经典树遍历算法DFS遍历二叉树。
- 初始时可设要求的最小值ans为-1
对于当前遍历节点有:
- 若当前节点为空,直接返回
- 若当前ans值不为-1(即非首次遍历),且当前节点值大于当前的ans(代表当前节点构成的子树不会有比ans更小的值)时,直接返回
- 若当前节点值小于ans,将ans替换为当前节点值
- 然后递归遍历当前节点的左右子节点。
代码:
public class FindSecondMinimunValue {
int ans;
int rootValue;
public int findSecondMinimumValue(TreeNode root) {
// 初始化
ans = -1;
rootValue = root.val;
// 遍历
dfs(root);
return ans;
}
public void dfs(TreeNode node) {
if (node == null) {
return;
}
if (ans != -1 && node.val >= ans) { // 当前节点及其子树不会有更小值
return;
}
if (node.val > rootValue) { // 更新
ans = node.val;
}
// 递归
dfs(node.left);
dfs(node.right);
}
}