235. 二叉搜索树的最近公共祖先
题目描述: 235. 二叉搜索树的最近公共祖先.
解法
递归
class Solution(object):
def lowestCommonAncestor(self, root, p, q):
if root.val > q.val and root.val > p.val:
return self.lowestCommonAncestor(root.left,p,q)
elif root.val < p.val and root.val <q.val:
return self.lowestCommonAncestor(root.right,p,q)
return root
主要思路就是,第一个符合在p和q之间的值的节点,就是他们的最近公共祖先
迭代
class Solution(object):
def lowestCommonAncestor(self, root, p, q):
while root:
if root.val < p.val and root.val < q.val:
root = root.right
elif root.val > p.val and root.val > q.val:
root = root.left
else:
return root
因为题目说了必定会有一个这样的节点,所以return root即可
701.二叉搜索树中的插入操作
题目描述: 701.二叉搜索树中的插入操作.
解法
递归
class Solution(object):
def travel(self,node,val):
if not node:
return TreeNode(val=val)
if node.val > val:
node.left = self.travel(node.left,val)
else:
node.right = self.travel(node.right,val)
return node
def insertIntoBST(self, root, val):
return self.travel(root,val)
按顺序找就行了,注意函数的返回值是什么就好
迭代
class Solution(object):
def insertIntoBST(self, root, val):
if not root:
return TreeNode(val)
pre = None
cur = root
while cur:
pre = cur
if cur.val > val:
cur = cur.left
else:
cur = cur.right
if pre.val < val:
pre.right = TreeNode(val)
else:
pre.left = TreeNode(val)
return root
450.删除二叉搜索树中的节点
题目描述: 450.删除二叉搜索树中的节点.
递归
class Solution(object):
def deleteNode(self, root, key):
if not root:
return
if root.val > key:
root.left = self.deleteNode(root.left,key)
if root.val < key:
root.right = self.deleteNode(root.right,key)
if root.val == key:
if not root.left and not root.right:# 没有子节点
return None
elif not root.left and root.right:
return root.right
elif not root.right and root.left:
return root.left
else:
cur = root.right
while cur.left:
cur = cur.left
cur.left = root.left
return root.right
return root
掌握好不同情况就行
1.没找到,直接返回就好
2.找到了,该节点没有指向任何东西,那在该结点的返回的就可以直接是None
3.找到了,该节点有左孩子,没有右孩子,那就返回左孩子
4.找到了,该节点有右孩子,没有左孩子,那就返回右孩子
5.找到了,该节点又有左孩子又有右孩子,可以将左孩子接到右孩子的最左端节点,然后返回右节点就好了