235. 二叉搜索树的最近公共祖先
思路很牛:利用二叉搜索树左子树<中间节点<右子树的特点,从上往下遍历,遇到的第一个数值大小在pq中间的节点即为最近公共祖先(这样一定是p在左子树,q在右子树--->pq分离)这样就把问题简化成了二分查找
# 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':
print(root.val)
if not root:
return root
# print(p.val)
if p.val>q.val:#始终保证p小q大
p,q = q,p
if root.val == p.val or root.val == q.val:#找到了
return root
if root.val>p.val and root.val<q.val:#找到了
return root
elif root.val>q.val:#在左子树
return self.lowestCommonAncestor(root.left,p,q)#需要加return,不然递归返回的结果只停留在返回,而最外层的函数是没有输出的
else:#往右子树找
return self.lowestCommonAncestor(root.right,p,q)
701.二叉搜索树中的插入操作
虽然有多种结构,只选择在叶子节点插入就比较简单--->将问题转化为一直二分直到查找一个空节点,这个节点的值比target大-->左节点,小--->右节点
但是有一点要注意的是,要添加节点,必须知道父节点,因此需要一个新的变量来记录父节点
# 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 __init__(self):
self.parentnode = TreeNode(0)#初始化,新建一个节点,接下来只需要找到插入位置的父节点即可
def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
if not root:#排除一下root为空的情况
return TreeNode(val)
self.searchBST(root,val)#更改root
return root
def searchBST(self,cur,val):
## 终止条件和操作
if not cur:#在当前叶子节点添加节点
node = TreeNode(val)
if self.parentnode.val < val:#添加到right
self.parentnode.right = node
else :
self.parentnode.left = node
return
self.parentnode = cur
if cur.val < val:#向右走
self.searchBST(cur.right,val)
else:
self.searchBST(cur.left,val)