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