数据结构和算法(二叉搜索树)

た 入场券 2024-03-31 08:50 192阅读 0赞

概述

二叉搜索树是二叉树的一种特殊形式。 二叉搜索树具有以下性质:每个节点中的值必须大于(或等于)其左侧子树中的任何值,但小于(或等于)其右侧子树中的任何值。

二叉搜索树(BST)是二叉树的一种特殊表示形式,它满足如下特性:

每个节点中的值必须大于(或等于)存储在其左侧子树中的任何值。

每个节点中的值必须小于(或等于)存储在其右子树中的任何值。

在二叉搜索树中实现搜索操作 - 介绍

二叉搜索树主要支持三个操作:搜索、插入和删除。 在本章中,我们将讨论如何在二叉搜索树中搜索特定的值。

根据BST的特性,对于每个节点:

如果目标值等于节点的值,则返回节点;

如果目标值小于节点的值,则继续在左子树中搜索;

如果目标值大于节点的值,则继续在右子树中搜索。

在二叉搜索树中实现插入操作 - 介绍

二叉搜索树中的另一个常见操作是插入一个新节点。有许多不同的方法去插入新节点,这篇文章中,我们只讨论一种使整体操作变化最小的经典方法。 它的主要思想是为目标节点找出合适的叶节点位置,然后将该节点作为叶节点插入。 因此,搜索将成为插入的起始。

与搜索操作类似,对于每个节点,我们将:

  • 根据节点值与目标节点值的关系,搜索左子树或右子树;
  • 重复步骤 1 直到到达外部节点;
  • 根据节点的值与目标节点的值的关系,将新节点添加为其左侧或右侧的子节点。

举例:(来源力扣)

二叉搜索树中的插入操作

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

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

输入:root = [40,20,60,10,30,50,70], val = 25

输出:[40,20,60,10,30,50,70,null,null,25]

插入一个数,需要考虑的是判断跟根节点的大小来判断插入哪一个子树,如果下面没有子树,则直接进行插入就可以了,如果有子树,就需要继续比较大小,知道到达叶子节点.

  1. class Solution {
  2. public TreeNode insertIntoBST(TreeNode root, int val) {
  3. if(root==null){
  4. return new TreeNode(val);
  5. }
  6. if(root.val>val){
  7. root.left=insertIntoBST(root.left,val);
  8. }else{
  9. root.right=insertIntoBST(root.right,val);
  10. }
  11. return root;
  12. }
  13. }
  14. class Solution {
  15. public TreeNode insertIntoBST(TreeNode root, int val) {
  16. if (root == null) {
  17. return new TreeNode(val);
  18. }
  19. TreeNode pos = root;
  20. while (pos != null) {
  21. if (val < pos.val) {
  22. if (pos.left == null) {
  23. pos.left = new TreeNode(val);
  24. break;
  25. } else {
  26. pos = pos.left;
  27. }
  28. } else {
  29. if (pos.right == null) {
  30. pos.right = new TreeNode(val);
  31. break;
  32. } else {
  33. pos = pos.right;
  34. }
  35. }
  36. }
  37. return root;
  38. }
  39. }

在二叉搜索树中实现删除操作 - 介绍

删除要比我们前面提到过的两种操作复杂许多。有许多不同的删除节点的方法,这篇文章中,我们只讨论一种使整体操作变化最小的方法。我们的方案是用一个合适的子节点来替换要删除的目标节点。根据其子节点的个数,我们需考虑以下三种情况:

    1. 如果目标节点没有子节点,我们可以直接移除该目标节点。
    1. 如果目标节只有一个子节点,我们可以用其子节点作为替换。
    1. 如果目标节点有两个子节点,我们需要用其中序后继节点或者前驱节点来替换,再删除该目标节点。

举例:(来源力扣)

删除二叉搜索树中的节点

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

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

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

如果找到了,删除它。

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

输出:[5,4,6,2,null,null,7]

解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。

一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。

另一个正确答案是 [5,2,6,null,4,null,7]。

  1. class Solution {
  2. public TreeNode deleteNode(TreeNode root, int key) {
  3. if (root == null) {
  4. return null;
  5. }
  6. if (key < root.val) {
  7. // 待删除节点在左子树中
  8. root.left = deleteNode(root.left, key);
  9. return root;
  10. } else if (key > root.val) {
  11. // 待删除节点在右子树中
  12. root.right = deleteNode(root.right, key);
  13. return root;
  14. } else {
  15. // key == root.val,root 为待删除节点
  16. if (root.left == null) {
  17. // 返回右子树作为新的根
  18. return root.right;
  19. } else if (root.right == null) {
  20. // 返回左子树作为新的根
  21. return root.left;
  22. } else {
  23. // 左右子树都存在,返回后继节点(右子树最左叶子)作为新的根
  24. TreeNode successor = min(root.right);
  25. successor.right = deleteMin(root.right);
  26. successor.left = root.left;
  27. return successor;
  28. }
  29. }
  30. }
  31. private TreeNode min(TreeNode node) {
  32. if (node.left == null) {
  33. return node;
  34. }
  35. return min(node.left);
  36. }
  37. private TreeNode deleteMin(TreeNode node) {
  38. if (node.left == null) {
  39. return node.right;
  40. }
  41. node.left = deleteMin(node.left);
  42. return node;
  43. }
  44. }
  45. class Solution {
  46. public TreeNode deleteNode(TreeNode root, int key) {
  47. if (root == null) {
  48. return null;
  49. }
  50. if (root.val > key) {
  51. root.left = deleteNode(root.left, key);
  52. return root;
  53. }
  54. if (root.val < key) {
  55. root.right = deleteNode(root.right, key);
  56. return root;
  57. }
  58. if (root.val == key) {
  59. if (root.left == null && root.right == null) {
  60. return null;
  61. }
  62. if (root.right == null) {
  63. return root.left;
  64. }
  65. if (root.left == null) {
  66. return root.right;
  67. }
  68. TreeNode successor = root.right;
  69. while (successor.left != null) {
  70. successor = successor.left;
  71. }
  72. root.right = deleteNode(root.right, successor.val);
  73. successor.right = root.right;
  74. successor.left = root.left;
  75. return successor;
  76. }
  77. return root;
  78. }
  79. }

发表评论

表情:
评论列表 (有 0 条评论,192人围观)

还没有评论,来说两句吧...

相关阅读

    相关 数据结构算法:搜索

    希望大家可以自己动手练习一下,算法光看是不行的,必须亲自动手敲代码,有时候你会发现自己有思路,但是又写不出来,这就是缺乏练习的原因。大家平时在做题的时候,可以多思考,多总...

    相关 数据结构搜索

    什么是二叉搜索树 二叉搜索树(BST)也称为二叉排序树或二叉查找树。 二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质。 非空左子树的键值小于其根结点

    相关 数据结构 搜索

    概述 二叉搜索树,也成为二叉查找树或者二叉排序树,这是一种特殊的二叉树。在二叉搜索树中的数据结构中,我们可以通过链表来表示。对该树种的节点,需要定义关键字data,父节点

    相关 数据结构————搜索

    二叉搜索树也叫二叉查找树,二叉排序树,BST。这是学习二叉平衡树、多路平衡树、B-树、B+树的基础。凡事要有个循序渐进。B+树在数据库中得到了应用,我想我们也非常有必要去了解它

    相关 数据结构搜索

    二叉搜索树,又称二叉排序树,它是一棵空树或者时具有如下性质的一棵二叉树: > 1.若它的左子树不为空,则左子树上所有节点的值都小于根结点; > 2.若它的右子树不为空,则右

    相关 数据结构_搜索

    二叉搜索树 所谓的查找,指从一组数据对象中找出符合特定条件者。其中的数据对象,统一的表示和实现为词条(entry)的形式;不同的数据项之间,依照各自的关键码(key)彼此区