今天前两道解出来了,
但是第一道没有利用到二叉搜索树的特性,看了之后才知道要来利用二叉搜索树的特性:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
def findL(root,p,q):
if not root:
return None
if root.val < p.val and root.val < q.val:
left = findL(root.right,p,q)
if left:
return left
if root.val > q.val and root.val > p.val:
right = findL(root.left,p,q)
if right:
return right
return root
return findL(root,p,q)
第二道,插入很好理解,留一个pre节点,在叶子节点插入就可以了
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
pre = None
def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
if not root:
return TreeNode(val)
def insI(root,val):
if not root:
if val < self.pre.val:
self.pre.left = TreeNode(val)
else:
self.pre.right = TreeNode(val)
return
self.pre = root
if val > root.val:
insI(root.right,val)
if val < root.val:
insI(root.left,val)
temp = root
insI(temp,val)
return root
第三道:
这道想到了处理情况很复杂,但是没细致的考虑做哟i孩子都存在的情况
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
## 感觉要用到pre
class Solution:
def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:
if root is None:
return root
if root.val == key:
if root.left is None and root.right is None:
return None
elif root.left is None:
return root.right
elif root.right is None:
return root.left
else:
cur = root.right
while cur.left is not None:
cur = cur.left
cur.left = root.left
return root.right
if root.val > key:
root.left = self.deleteNode(root.left, key)
if root.val < key:
root.right = self.deleteNode(root.right, key)
return root