![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
二叉搜索树
996冲冲冲
这个作者很懒,什么都没留下…
展开
-
leetcode1008. 前序遍历构造二叉搜索树
根据二叉搜索树的性质,左子树的所有节点小于根节点,右子树的所有节点大于根节点。根据下标和性质建立二叉搜索数。根据先序和中序建树,同剑指。原创 2023-01-12 00:18:44 · 88 阅读 · 0 评论 -
剑指 Offer 33. 二叉搜索树的后序遍历序列
单调栈,对后序进行逆序变成根右左,左子树的根节点离root最近。后续遍历判断二叉搜索树是否合法。原创 2022-12-12 10:17:59 · 102 阅读 · 0 评论 -
LC173. 二叉搜索树迭代器
其实就相当于二叉搜索树的中序遍历,在next的时候返回一次结果。所以可以直接存储中序遍历的所有结果在调用next方法时返回#方法一也可以用迭代的方法来进行中序遍历,将迭代法进行拆分在next中返回#方法二...原创 2022-07-01 21:10:31 · 111 阅读 · 0 评论 -
LC669. 修剪二叉搜索树
迭代递归原创 2022-06-30 21:27:15 · 73 阅读 · 0 评论 -
LC501. 二叉搜索树中的众数
暴力计算众数,空间复杂度O(N),因为用了一个数组存储中序遍历的结果之后就是有序数组求众数了,这其实没有用到二叉搜索树的特性。空间复杂度O(1)的方法原创 2022-06-29 17:05:10 · 116 阅读 · 0 评论 -
LC235. 二叉搜索树的最近公共祖先
二叉搜索树性质决定了:如果 p.val 和 q.val 都比 root.val 小,则p、q肯定在 root 的左子树。那问题规模就变小了,递归左子树就行!如果 p.val 和 q.val 都比 root.val 大,递归右子树就行!其他情况,root 即为所求:只要 p.val 和 q.val 不是都大于(小于) root.val,即只要 p, q 不同处在 root 的一个子树就只有这三种情况:p 和 q 分居 root 的左、右子树。root 就是 p,q 在 p 的子树中。root原创 2022-06-13 16:52:28 · 76 阅读 · 0 评论 -
LC109. 有序链表转换二叉搜索树
普通递归建树递的时候建树,归的时候给节点传值。中序位置就是链表的顺序原创 2022-06-08 22:02:23 · 82 阅读 · 0 评论 -
LC99. 恢复二叉搜索树
不使用辅助数组,根据二叉搜索树的性质中序遍历是有序的,用pre记录前一个节点的值。如果前一个节点的值大于后面的说明找到了一对顺序不符合的情况。之后遍历完看是否还有另一对,记录第一对错误节点的大值后后一对错误节点的小值,交换他们。...原创 2022-06-08 16:01:26 · 111 阅读 · 0 评论 -
LC96. 不同的二叉搜索树
固定 root 节点,剩下的 n-1 个节点将分别放在左子树和右子树。计算以每个数为根节点的二叉搜索树数量,最后相加求和class Solution(object): global memo memo = collections.defaultdict(int) def numTrees(self, n): """ :type n: int :rtype: int """ if n ==0 or n==原创 2022-05-31 16:49:25 · 117 阅读 · 0 评论 -
LC 95. 不同的二叉搜索树 II
递归构建,自底向上,先构建左右子树再连接根节点,自底向上得到答案。def generateTrees(self, n): """ :type n: int :rtype: List[TreeNode] """ def gen(l,r): if l > r: return [None,] res=[] for i in原创 2022-05-31 10:31:37 · 78 阅读 · 0 评论 -
LC450. 删除二叉搜索树中的节点
分为三种情况,没有左子节点,没有右子节点,有两个子节点。注意这种直接接到另一颗树后面的做法无法保持二叉树的平衡性def deleteNode(self, root, key): """ :type root: TreeNode :type key: int :rtype: TreeNode """ if not root: return if root.val >原创 2022-05-28 20:50:06 · 72 阅读 · 0 评论 -
LC701. 二叉搜索树中的插入操作
先找到插入位置,之后需要连接到树上def insertIntoBST(self, root, val): """ :type root: TreeNode :type val: int :rtype: TreeNode """ if not root: return TreeNode(val) if root.val > val: root.原创 2022-05-26 21:26:49 · 83 阅读 · 0 评论 -
LC700. 二叉搜索树中的搜索
暴力法,遍历所有的二叉树节点,看能不能找到def searchBST(self, root, val): """ :type root: TreeNode :type val: int :rtype: TreeNode """ if not root: return if root.val == val: return root原创 2022-05-26 20:23:19 · 67 阅读 · 0 评论 -
LC98. 验证二叉搜索树
二叉搜索树的性质就是左子树中所有节点值小于当前根节点,右子树中所有节点值大于当前根节点def isValidBST(self, root): """ :type root: TreeNode :rtype: bool """ min1 = TreeNode(float('-inf')) max1 = TreeNode(float('inf')) def helper(root,min1,max1原创 2022-05-26 10:37:15 · 116 阅读 · 0 评论 -
LC538. 把二叉搜索树转换为累加树
转换为累加树,就是把节点的值换成小于等于当前节点的值的和。根据二叉搜索树的特性,中序遍历是有序的,我们可以反过来右左根让它降序,然后再累加替换节点的值就是答案.def bstToGst(self, root): """ :type root: TreeNode :rtype: TreeNode """ self.sum = 0 def inorder(root): if not root原创 2022-05-25 19:47:00 · 73 阅读 · 0 评论 -
LC230. 二叉搜索树中第K小的元素
迭代中序遍历从最小的节点开始计数,返回第k个就是第K小的元素def kthSmallest(self, root, k): stack = [] while root or stack: if root: stack.append(root) root = root.left else: tmp = stack.pop()原创 2022-05-25 11:03:13 · 65 阅读 · 0 评论 -
LC530. 二叉搜索树的最小绝对差
中序遍历迭代def getMinimumDifference(self, root): """ :type root: TreeNode :rtype: int """ pre = None res = 10**4 stack = [] while stack or root: if root: stack.append(r原创 2022-04-26 10:46:47 · 474 阅读 · 0 评论