671. Second Minimum Node In a Binary Tree

题目详情:https://leetcode.com/problems/second-minimum-node-in-a-binary-tree/description/
暴力破解,管它什么特征呢

# -*- coding:utf-8 -*-
class Solution(object):
    def inOrder(self,root):#中序遍历保存访问的序列
        if root:
            self.inOrder(root.left)
            self.inSqe.append(root.val)
            self.inOrder(root.right)

    def findSecondMinimumValue(self, root):#暴力破解
        """
        :type root: TreeNode
        :rtype: int
        """
        self.inSqe=[]#用以保存中序遍历的序列
        self.inOrder(root)#中序遍历
        self.inSqe.sort()#排序,必须得排序,没有说右子树的元素大于左子树
        first=self.inSqe[0]
        for e in self.inSqe:
            if first!=e:#找到和第一个元素不同的元素则停止
                return e#并返回该元素
        return -1

下面的代码利用了该树中的一些特征进行求解
1、如果树的结构如图所示,即左、右子树的值都比根节点的值大,那么第二小的值一定为左、右子树的值
这里写图片描述
2、如果树的结构如图所示,即左子树的值和根节点的相同,右子树的值和根节点的值不同,那么需要到左子树上去找可能存在的第二小值
这里写图片描述
3、如果树的结构如图所示,即右子树的值和根节点相同,左子树的值和根节点的值不同;那么需要到右子树上去查找可能存在的第二小值,不需要到左子树上去找,因为左子树上值都大于等于以3为根节点的值
这里写图片描述
代码表达如下:

# -*- coding:utf-8 -*-
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution(object):
    def findSecond(self,root,first):
        if root.left and root.right:#左右子树都存在的情况
            leftVal,rightVal=root.left.val,root.right.val
            if root.left.val!=first and root.right.val!=first:#值都不相同的时候
                return min(root.left.val,root.right.val)#则直接返回左,右子树中的较小值
            if root.left.val==first:#左子树的值等于根节点的值,那么第二小的值可能出现在左子树
                leftVal=self.findSecond(root.left,first)
            if root.right.val==first:#右子树的值等于根节点的值,那么第二小的值也可能出现在右子树上
                rightVal=self.findSecond(root.right,first)
            #print leftVal,rightVal
            if leftVal==-1 and rightVal==-1:#如果左子树和右子树上的第二小的元素都不存在
                return -1#那么返回-1
            elif leftVal==-1:#执行到这,说明左子树和右子树上第二小的元素至少存在一个
                return rightVal#左子树的“第二小的元素”不存在,那么返回右子树”第二小元素“
            elif rightVal==-1:#右子树”第二小“的元素不存在,那么返回左子树”第二小“的元素
                return leftVal
            else:#都不等于-1的时候
                return min(leftVal,rightVal)#则返回两者的较小值
        return -1#左右子树都为空的时候,则返回没有找到的标志
    def findSecondMinimumValue(self, root):
        """:
        type root: TreeNode
        :rtype: int
        """
        if root.left==None:#只有一个节点
            return -1#则直接返回-1
        return self.findSecond(root,root.val)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值