当前位置:   article > 正文

数据结构进阶篇,二叉搜索树专题

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k

230. 二叉搜索树中第K小的元素

  「题目:」

  给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。

  「示例:」

  输入:root = [3,1,4,null,2], k = 1 ,输出:1。

  「解题思路:」

  由于这是一个二叉搜索树,所以其中序序列是一个严格的递增序列。

  那么本道题就转化为寻找中序序列中第 k 个元素的问题。

  时间复杂度:O(n),空间复杂度:O(n)。

  1. const kthSmallest = (root, k) => {
  2.   let ans = 0;
  3.   let count = 0;
  4.   const dfs = (root) => {
  5.     if (!root) {
  6.       return;
  7.     }
  8.     dfs(root.left);
  9.     if (++count === k) {
  10.       ans = root.val;
  11.       return;
  12.     }
  13.     dfs(root.right);
  14.   }
  15.   dfs(root);
  16.   return ans;
  17. }

450. 删除二叉搜索树中的节点

  「题目:」

  给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

  一般来说,删除节点可分为两个步骤:

  • 首先找到需要删除的节点;

  • 如果找到了,删除它。

  「示例:」

  root = [5,3,6,2,4,null,7], key = 3,输出:[5,4,6,2,null,null,7]。

06cd6289e07167256b2dbfaacf07a431.jpeg

  「解题思路:」

  首先,通过递归遍历可以很容易地找到目标节点,然后需要处理三种情况:

  • 当前节点值大于目标值。

  • 当前节点值小于目标值。

  • 当前节点值等于目标值。

  针对第一种情况:利用二叉搜索树中左子树的所有节点严格小于根节点的特性,那么目标值必定存在于当前根节点的左子树中,对其左子树进行删除操作即可。

  同理,针对第二种情况,对其右子树进行删除操作。

  第三种情况比较复杂,又分为以下两种情况:

  • 存在一个或者零个子树。

  • 左右子树都存在。

  针对第一种情况:只需要返回对应的子树即可。

  针对第二种情况:需要在删除目标元素之后,仍然保持二叉搜索树的特性,所以需要在其右子树中找出最小的元素,作为新的根节点。

  这里采用值替换的方式,然后再对右子树进行最小值的删除操作。

  时间复杂度:O(logn),空间复杂度:O(n)。

  1. const deleteNode = (root, key) => {
  2.   if (!root) {
  3.     return null;
  4.   }
  5.   const rootVal = root.val;
  6.   if (rootVal > key) {
  7.     root.left = deleteNode(root.left, key);
  8.   } else if (rootVal < key) {
  9.     root.right = deleteNode(root.right, key);
  10.   } else {
  11.     if (root.left && root.right) {
  12.       let min = root.right;
  13.       while (min.left) {
  14.         min = min.left;
  15.       }
  16.       root.val = min.val;
  17.       root.right = deleteNode(root.right, min.val);
  18.     } else {
  19.       return root.left ? root.left : root.right;
  20.     }
  21.   }
  22.   return root;
  23. }

701. 二叉搜索树中的插入操作

  「题目:」

  给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。返回插入后二叉搜索树的根节点。输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。

  注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。你可以返回 任意有效的结果 。

  「示例:」

  输入:root = [4,2,7,1,3], val = 5,输出:[4,2,7,1,3,5]。

1ed2da25e2d23d30d7c4db9ac3a880f3.jpeg

  「解题思路:」

  本道题仍然是利用二叉搜索树的特性:左子树上所有节点的值均小于根节点的值,右子树上所有节点的值均大于根节点的值。

  在递归遍历的过程中,不断比较当前根节点与目标值的大小,从而转化为将目标值插入到左子树或者右子树的问题。

  当当前根节点为空时,就是目标值插入的位置,并且需要链接到其父节点上。

  时间复杂度:O(height),空间复杂度:O(1)。

  1. const insertIntoBST = (root, val) => {
  2.   if (!root) {
  3.     return new TreeNode(val);
  4.   }
  5.   if (root.val > val) {
  6.     root.left = insertIntoBST(root.left, val);
  7.   }
  8.   if (root.val < val) {
  9.     root.right = insertIntoBST(root.right, val);
  10.   }
  11.   return root;
  12. }

写在最后

  LeetCode 数据结构篇根据难度划分为:

  • 数据结构入门篇

  • 数据结构进阶篇

  • 数据结构高级进阶篇

  每篇会根据题目的类型和解题思路形成不同的专题,这样更利于摸清本质,将技巧内化于心。

  感兴趣的小伙伴可以关注下方的公众号,或者微信搜索“漫谈大前端”,如果本文对你有帮助,欢迎点赞、分享、转发。

  相关链接:

  • https://leetcode.cn/problems/kth-smallest-element-in-a-bst/

  • https://leetcode.cn/problems/delete-node-in-a-bst/

  • https://leetcode.cn/problems/insert-into-a-binary-search-tree/

4a82092737b4909aba6f4da94e762bee.jpeg

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/892070
推荐阅读
相关标签
  

闽ICP备14008679号