给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]
Python:往下遍历,寻找第一个在两个节点的值之间[p.val, q.val] 的节点
# 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':
if not root:
return
cur = root
while cur:
if cur.val > q.val and cur.val > p.val:
cur = cur.left
elif cur.val < q.val and cur.val < p.val:
cur = cur.right
else:
return cur
return None
给定二叉搜索树(BST)的根节点 root
和要插入树中的值 value
,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。
注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。
Python: 按照二叉树搜索的方法,找到插入的位置,直接插入即可
# 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:
def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
if not root:
return TreeNode(val=val)
cur = root
while cur:
if cur.val > val:
if cur.left is None:
cur.left = TreeNode(val=val)
return root
else:
cur = cur.left
else:
if cur.right is None:
cur.right = TreeNode(val=val)
return root
else:
cur = cur.right
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
- 首先找到需要删除的节点;
- 如果找到了,删除它。
Python:根据待删除节点的不同情况进行不同处理
- 如果没有找到待删除节点,直接返回根节点
- 如果待删除节点没有子节点,直接删除该节点
- 如果待删除节点只有左孩子,删除节点,左孩子补位
- 如果待删除节点只有右孩子,删除节点,右孩子补位
- 如果待删除结点有左右孩子,右孩子补位,左孩子成为右子树最左节点的左孩子
# 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:
def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:
if not root:
return None
if root.val == key:
if not root.left and not root.right:
return None
elif not root.left :
return root.right
elif not root.right:
return root.left
else:
cur = root.right
while cur.left:
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