核心:记住递归三部曲,一般传入的参数的都是题目给好的了!把构造树类似于前序遍历一样就可!就是注意单层递归的逻辑!
class Solution :
def constructMaximumBinaryTree ( self, nums: List[ int ] ) - > Optional[ TreeNode] :
if not nums:
return
max_ = max ( nums)
max_index = nums. index( max_)
root = TreeNode( max_)
root. left = self. constructMaximumBinaryTree( nums[ : max_index] )
root. right = self. constructMaximumBinaryTree( nums[ max_index + 1 : ] )
return root
def constructMaximumBinaryTree2 ( self, nums: List[ int ] ) - > Optional[ TreeNode] :
if len ( nums) == 1 :
return TreeNode( nums[ 0 ] )
node = TreeNode( 0 )
max_numb = 0
max_index = 0
for i in range ( len ( nums) ) :
if nums[ i] > max_numb:
max_index = i
max_numb = nums[ i]
node. val = max_numb
if max_index > 0 :
new_list = nums[ : max_index]
node. left = self. constructMaximumBinaryTree( new_list)
if max_index < len ( nums) - 1 :
new_list = nums[ max_index + 1 : ]
node. right = self. constructMaximumBinaryTree( new_list)
return node
思路:以建立的节点为标准,类似于前缀【中后序】遍历进行构造!或者使用迭代法【建立两个队列进行维护就好了】
class Solution :
def mergeTrees ( self, root1: Optional[ TreeNode] , root2: Optional[ TreeNode] ) - > Optional[ TreeNode] :
if not root1:
return root2
if not root2:
return root1
node = TreeNode( )
node. val = root1. val + root2. val
node. left = self. mergeTrees( root1. left, root2. left)
node. right = self. mergeTrees( root1. right, root2. right)
return node
def mergeTrees1 ( self, root1: Optional[ TreeNode] , root2: Optional[ TreeNode] ) - > Optional[ TreeNode] :
if not root1 and not root2:
return
node = TreeNode( 0 )
if root1 and root2:
node. val = root1. val + root2. val
node. left = self. mergeTrees( root1. left, root2. left)
node. right = self. mergeTrees( root1. right, root2. right)
elif root1 and not root2:
node. val = root1. val
node. left = self. mergeTrees( root1. left, None )
node. right = self. mergeTrees( root1. right, None )
else :
node. val = root2. val
node. left = self. mergeTrees( None , root2. left)
node. right = self. mergeTrees( None , root2. right)
return node
思想:使用层次遍历或者使用递归或迭代
class Solution :
def searchBST ( self, root: Optional[ TreeNode] , val: int ) - > Optional[ TreeNode] :
queue_1 = [ ]
if not root:
return None
queue_1. append( root)
while len ( queue_1) > 0 :
node = queue_1. pop( 0 )
if node. val == val:
return node
if node. left:
queue_1. append( node. left)
if node. right:
queue_1. append( node. right)
return None
def searchBST ( self, root: Optional[ TreeNode] , val: int ) - > Optional[ TreeNode] :
while root:
if root. val > val:
root = root. left
elif root. val < val:
root = root. right
else :
return root
return None
def searchBST ( self, root: TreeNode, val: int ) - > TreeNode:
if not root or root. val == val:
return root
if root. val > val:
return self. searchBST( root. left, val)
if root. val < val:
return self. searchBST( root. right, val)
核心:理解中序遍历的规则,在二叉树中中序遍历出来的结果一定是有序的!
class Solution :
def __init__ ( self) :
self. nums = [ ]
def isValidBST ( self, root: Optional[ TreeNode] ) - > bool :
self. nums = [ ]
self. traversal( root)
for i in range ( 1 , len ( self. nums) ) :
if self. nums[ i] <= self. nums[ i - 1 ] :
return False
return True
def traversal ( self, root) :
if root is None :
return
self. traversal( root. left)
self. nums. append( root. val)
self. traversal( root. right)
class Solution :
def __init__ ( self) :
self. maxVal = float ( '-inf' )
def isValidBST ( self, root) :
if root is None :
return True
left = self. isValidBST( root. left)
if self. maxVal < root. val:
self. maxVal = root. val
else :
return False
right = self. isValidBST( root. right)
return left and right