530. 二叉搜索树的最小绝对差
给你一个二叉搜索树的根节点 root
,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
示例 1:
输入:root = [4,2,6,1,3] 输出:1
示例 2:
输入:root = [1,0,48,null,null,12,49] 输出:1
class Solution:
result=float('inf') #定义result为正无穷大
pre=None #定义pre为空 用pre来记录上一个值 从而可以取差值
def traversal(self,root:Optional[TreeNode]):#二叉搜索树用中序遍历就可以从小到大输出
if not root:
return
self.traversal(root.left)
if self.pre:
self.result=min(self.result,root.val-self.pre.val)
self.pre=root
self.traversal(root.right)
def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
self.traversal(root)
return self.result
501. 二叉搜索树中的众数
给你一个含重复值的二叉搜索树(BST)的根节点 root
,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
示例 1:
输入:root = [1,null,2,2] 输出:[2]
示例 2:
输入:root = [0] 输出:[0]
class Solution:
def getCount(self,root,count):
if not root:
return
count[root.val]=count.get(root.val,0)+1
self.getCount(root.left,count)
self.getCount(root.right,count)
def findMode(self, root: Optional[TreeNode]) -> List[int]:
count={}
self.getCount(root,count)
maxnum=max(count.values())
result=[]
for keys,nums in count.items():
if nums==maxnum:
result.append(keys)
return result
236. 二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
示例 1:
输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出:3 解释:节点5
和节点1
的最近公共祖先是节点3 。
示例 2:
输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出:5 解释:节点5
和节点4
的最近公共祖先是节点5 。
因为根据定义最近公共祖先节点可以为节点本身。
示例 3:
输入:root = [1,2], p = 1, q = 2 输出:1
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if root==p or root==q or not root:#终止条件
return root
left=self.lowestCommonAncestor(root.left,p,q)#判断左边有没有
right=self.lowestCommonAncestor(root.right,p,q)#判断右边有没有
if left is not None and right is not None:#后序是从下往上操作 前序是从上往下操作 如果遇到左右都有的 说明是祖先节点 如果仅仅左右一方有则继续往上返回
return root
elif not left:
return right
elif not right:
return left
else:
return None