671. 二叉树中第二小的节点

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

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

示例 1:

输入:
2
/ \
2 5
/ \
5 7

输出: 5
说明: 最小的值是 2 ,第二小的值是 5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/second-minimum-node-in-a-binary-tree

 1 public class FindSecondMinimumValue {
 2     static class TreeNode {
 3         int val;
 4         TreeNode left;
 5         TreeNode right;
 6         TreeNode(int x) {
 7             val = x;
 8         }
 9     }
10     //由条件可知,根节点一定是最小的,其余的父节点也是小于子节点,分别找到
11     //根节点的左右子树中第一次不与根节点相等的节点,两者中较大的即是第二小的
12     public int findSecondMinimumValue(TreeNode root) {
13         if(root == null) {
14             return -1;
15         }
16         if(root.left == null && root.right == null) {
17             return -1;
18         }
19         int leftVal = root.left.val;
20         int rightVal = root.right.val;
21
22         //如果子节点的值等于父节点,则对子节点进行递归,可能全部等于根节点(返回-1)
23         if(leftVal == root.val) {
24             leftVal = findSecondMinimumValue(root.left);
25         }
26         if(rightVal == root.val) {
27             rightVal = findSecondMinimumValue(root.right);
28         }
29         //如果两个都与父节点不相等,则返回其中较小的值
30         if(leftVal != -1 && rightVal != -1){
31             return Math.min(leftVal, rightVal);
32         }
33
34         //如果其中一个与父节点不相等,则返回该值;即使两个都为-1,最后返回的也是-1
35         if(leftVal != -1) {
36             return leftVal;
37         }
38         return rightVal;
39     }
40 }

原文地址:https://www.cnblogs.com/xiyangchen/p/11108243.html

时间: 2024-10-13 11:28:41

671. 二叉树中第二小的节点的相关文章

LeetCode 671. 二叉树中第二小的节点(Second Minimum Node In a Binary Tree) 9

671. 二叉树中第二小的节点 671. Second Minimum Node In a Binary Tree 题目描述 给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0.如果一个节点有两个子节点的话,那么这个节点的值不大于它的子节点的值. 给出这样的一个二叉树,你需要输出所有节点中的第二小的值.如果第二小的值不存在的话,输出 -1. 每日一算法 2019/5/12Day 9 LeetCode671. Second Minimum Node In a B

671. Second Minimum Node In a Binary Tree 二叉树中第二小节点

Given a non-empty special binary tree consisting of nodes with the non-negative value, where each node in this tree has exactly twoor zero sub-node. If the node has two sub-nodes, then this node's value is the smaller value among its two sub-nodes. G

六:二叉树中第k层节点个数与二叉树叶子节点个数

二叉树中第k层节点个数 递归解法: (1)如果二叉树为空或者k<1返回0 (2)如果二叉树不为空并且k==1,返回1 (3)如果二叉树不为空且k>1,返回左子树中k-1层的节点个数与右子树k-1层节点个数之和 代码如下: int GetNodeNumKthLevel(BinaryTreeNode *pRoot, int k) { if(pRoot == NULL || k < 1) return 0; if(k == 1) return 1; int numLeft = GetNodeN

二叉树中任意两个节点的最近公共祖先节点

1.二叉树是个搜索二叉树 2.二叉树带有指向parent的指针 可转换成两个链表的相交节点 3.普通二叉树 保存从根节点分别到这两个节点的路径到list1和list2中 从list1和list2中找第一个不相等的节点即为最近公共祖先节点 template<class T> BinaryTreeNode<T>*  BinaryTree<T>::lastCommnParent(BinaryTreeNode<T>*& node1, BinaryTreeNo

在最坏情况下,找到n个元素中第二小的元素需要n+lgn-2次比较

首先两两比较找到最大的元素,需要n-1次,即二叉树的非叶子节点的个数.之后次最大的一定在和最大的元素比较过的元素中,共有lgn-1个,即树的高度.故加起来就是n+lgn-2 #include<iostream> using namespace std; class Node { public: Node(); Node(int d); Node*left; Node*right; int data; }; Node::Node() { right = left = NULL; } Node::

求二叉树中最多的黑色节点

Problem: given a tree, color nodes black as many as possible without coloring two adjacent nodes   思路: 如果根节点r被标记为黑色,则其直接子节点不能被标记为黑色,如果不标记r,则其子节点可以标记为黑色,得到状态转移方程: find(r) = max(black(r), white(r)) black(r)为当节点r被标记为黑色时,以r根节点的树中最多可标记为黑色的节点数 white(r)为当节点

二叉树中任意两节点的最低共同父节点

通过两个和二叉树相关的算法题来看看和递归在二叉树中的应用 输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点. 思路: 如果这两个节点不在同一个子树下面,那么这棵树的根节点就是他们的共同最低父节点. 如果两个都在右子树,那么以右子树的最上面的那个节点作为根节点,重新进行判断,递归调用. 同理两个都在左子树,则方法同上.  也就是说,最终的结果分别只有三种情况,一个节点在右子树,一个节点在左子树.两个节点都在右子树,两个节点都在左子树. 如果是第一种情况,那么当前的节点就是他们最低的公共

3.8 求二叉树中节点的最大距离

题目: 把二叉树看成一个图,父子节点之间的连线看成是双向的,定义"距离"为两个节点之间的边数. 求一颗二叉树中的两个节点之间的距离的最大值. 方法一:用书上写的方法: 代码: struct node { node *left; node *right; int nMaxLeft; int nMaxRight; char ch; }; int nMaxLength = 0; void FindMaxDistance(node *root) { if(root == NULL) retur

求二叉树第K层的节点个数+求二叉树叶子节点的个数

size_t _FindLeafSize(Node* root)     //求二叉树叶子节点的个数    {        //static size_t count = 0;        if (root == NULL)            return 0; if (root->_left == NULL&&root->_right == NULL);        return 1; return _FindLeafSize(root->_right) +