zoukankan      html  css  js  c++  java
  • 671. 二叉树中第二小的节点 二叉树 dfs

    给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么该节点的值等于两个子节点中较小的一个。

    更正式地说,root.val = min(root.left.val, root.right.val) 总成立。

    给出这样的一个二叉树,你需要输出所有节点中的第二小的值。如果第二小的值不存在的话,输出 -1 。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/second-minimum-node-in-a-binary-tree
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
     *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
     *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
     * };
     */
    class Solution {
    public:
        int findSecondMinimumValue(TreeNode* root) {
            // 转化为求左右子树的最小值
            return dfs(root, root->val);
        }
    
        int dfs(TreeNode* root, int value) {
            // 叶节点
            if (!root) {
                return -1;
            }
            // 若当前节点值>根节点,则直接返回它的值
            if (root->val > value) {
                return root->val;
            }
            // 否则当前节点值必等于根节点
            // 此时要在左右子树寻找目标节点
            int l = dfs(root->left, value);
            int r = dfs(root->right, value);
    
            // 若左右子树均存在大于最小值的节点,则返回较小的那个,因为要的是第二小
            if (l > 0 && r > 0) {
                return min(l, r);
            }
            // 否则返回较大的那个
            return max(l, r);
        }
    };
    
  • 相关阅读:
    Kinect 开发 —— 硬件设备解剖
    Kinect 开发 —— 引言
    (转)OpenCV 基本知识框架
    OpenCV —— 摄像机模型与标定
    OpenCV —— 跟踪与运动
    OpenCV —— 图像局部与分割(二)
    OpenCV —— 图像局部与部分分割(一)
    OpenCV —— 轮廓
    OpenCV —— 直方图与匹配
    OpenCV —— 图像变换
  • 原文地址:https://www.cnblogs.com/xgbt/p/15065702.html
Copyright © 2011-2022 走看看