671. Second Minimum Node In a Binary Tree

来源:互联网 发布:开淘宝需要多少保证金 编辑:程序博客网 时间:2024/06/11 06:26

题目详情: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 = Noneclass 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)