235. 二叉搜索树的最近公共祖先
思路: 本题比直接找二叉树的最近公共祖先更容易, 可以利用二叉树的性质。 node 左边的值都小于node, node 右边的值都大于node。 指针从 root 开始, 如果两个值都小于node, 指针往左移动, 反之往右移动。 如果 node 的值恰好等于其中一个值,或者node值介于两个值中间, 输出该node。
难点: 无
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
cur_node = root
low = min(p.val, q.val)
high = max(p.val, q.val)
while cur_node:
if cur_node.val == low or cur_node.val == high or (cur_node.val > low and cur_node.val < high):
return cur_node
elif cur_node.val < low:
cur_node = cur_node.right
else:
cur_node = cur_node.left
return cur_node
701.二叉搜索树中的插入操作
LeetCode - The World's Leading Online Programming Learning Platform
思路: 插入操作要简单一些, 利用二叉树的性质, 如果 node.val 大于 要插入的值, 就往node的左边探, 如果node.val 小于 要插入的值就往右边探。 如果 node 是空的了, 就返回一个新 node, 新node 的值等于node.val
难点: 判断迭代的时候返回的条件即可
class Solution:
def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
if not root:
return TreeNode(val)
if root.val < val:
root.right = self.insertIntoBST(root.right, val)
else:
root.left = self.insertIntoBST(root.left, val)
return root
450.删除二叉搜索树中的节点
思路:删除元素的操作要复杂一点, 首先要找到元素。 然后如果这个元素是 root 的话, 就把 root 的左边元素全部放到右边的最左边, 并返回root.right,如果不是root, 就让 root.left = 删除元素后的 root.right, 或者 root.right = 删除元素后的 root.right
难点: 要改变Tree 的结构, 想好删除的node.left 放到哪里。
class Solution:
def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:
if not root:
return None
if root.val > key:
root.left = self.deleteNode(root.left, key)
elif root.val < key:
root.right = self.deleteNode(root.right, key)
else:
_tmp_node = root.left
if not root.right:
return _tmp_node
else:
cur_node = root.right
while cur_node.left:
cur_node = cur_node.left
cur_node.left = _tmp_node
return root.right
return root