ToB企服应用市场:ToB评测及商务社交产业平台

标题: 二叉搜索树(Binary Search Tree,BST) [打印本页]

作者: 耶耶耶耶耶    时间: 2023-9-14 00:12
标题: 二叉搜索树(Binary Search Tree,BST)
二叉搜索树(Binary Search Tree,BST)

二叉搜索树(Binary Search Tree),也称二叉查找树或二叉排序树,是一种特殊的二叉树,它满足以下性质
由于这种特性,二叉搜索树可以支持高效地进行查找、插入和删除操作。对于查找操作,可以通过比较目标值与当前节点的值来决定向左子树还是右子树进行搜索。对于插入操作,可以按照比较结果找到合适的位置并插入新节点。对于删除操作,则需要按照一定规则来处理不同情况下的节点删除
插入节点

在二叉搜索树中插入一个新节点的步骤如下:
示例代码:
  1. class TreeNode {
  2.     int val;
  3.     TreeNode left;
  4.     TreeNode right;
  5.     public TreeNode(int val) {
  6.         this.val = val;
  7.         this.left = null;
  8.         this.right = null;
  9.     }
  10. }
  11. class BinarySearchTree {
  12.     private TreeNode root;
  13.     public BinarySearchTree() {
  14.         root = null;
  15.     }
  16.     // 插入节点
  17.     public void insert(int val) {
  18.         root = insertNode(root, val);
  19.     }
  20.     private TreeNode insertNode(TreeNode root, int val) {
  21.         // 如果当前节点为空,说明找到了应该插入的位置,创建新节点并返回
  22.         if (root == null) {
  23.             return new TreeNode(val);
  24.         }
  25.         // 如果插入的值小于当前节点的值,向左子树插入
  26.         if (val < root.val) {
  27.             root.left = insertNode(root.left, val);
  28.         } else if (val > root.val) {
  29.             // 如果插入的值大于当前节点的值,向右子树插入
  30.             root.right = insertNode(root.right, val);
  31.         }
  32.         return root;
  33.     }
  34. }
复制代码
搜索节点(查找)

在二叉搜索树中搜索一个特定值的步骤如下:
  1. class TreeNode {
  2.     int val;
  3.     TreeNode left;
  4.     TreeNode right;
  5.     public TreeNode(int val) {
  6.         this.val = val;
  7.         this.left = null;
  8.         this.right = null;
  9.     }
  10. }
  11. class BinarySearchTree {
  12.     // 搜索节点
  13.     public boolean search(int val) {
  14.         return searchNode(root, val);
  15.     }
  16.     private boolean searchNode(TreeNode root, int val) {
  17.         // 当前节点为空,未找到目标值
  18.         if (root == null) {
  19.             return false;
  20.         }
  21.         // 目标值与当前节点的值相等,找到目标值
  22.         if (val == root.val) {
  23.             return true;
  24.         } else if (val < root.val) {
  25.             // 目标值小于当前节点的值,在左子树中继续搜索
  26.             return searchNode(root.left, val);
  27.         } else {
  28.             // 目标值大于当前节点的值,在右子树中继续搜索
  29.             return searchNode(root.right, val);
  30.         }
  31.     }
  32. }
复制代码
删除节点

在二叉搜索树中删除一个节点的步骤如下:
  1. class TreeNode {
  2.     int val;
  3.     TreeNode left;
  4.     TreeNode right;
  5.     public TreeNode(int val) {
  6.         this.val = val;
  7.         this.left = null;
  8.         this.right = null;
  9.     }
  10. }
  11. class BinarySearchTree {
  12.     private TreeNode deleteNode(TreeNode root, int val) {
  13.         // 当前节点为空,未找到要删除的节点
  14.         if (root == null) {
  15.             return null;
  16.         }
  17.         // 如果要删除的值小于当前节点的值,在左子树中继续搜索
  18.         if (val < root.val) {
  19.             root.left = deleteNode(root.left, val);
  20.         } else if (val > root.val) {
  21.             // 如果要删除的值大于当前节点的值,在右子树中继续搜索
  22.             root.right = deleteNode(root.right, val);
  23.         } else {
  24.             // 找到要删除的节点
  25.             // 情况1: 当节点没有子节点时,直接返回 null
  26.             if (root.left == null && root.right == null) {
  27.                 return null;
  28.             }
  29.             // 情况2: 当节点只有一个子节点时,返回子节点作为当前节点的替代
  30.             if (root.left == null) {
  31.                 return root.right;
  32.             } else if (root.right == null) {
  33.                 return root.left;
  34.             }
  35.             // 情况3: 当节点有两个子节点时,找到右子树中最小的节点,
  36.             //       用该节点的值替代当前节点的值,并删除右子树中最小的节点
  37.             TreeNode successor = findMin(root.right);
  38.             root.val = successor.val;
  39.             root.right = deleteNode(root.right, successor.val);
  40.         }
  41.         return root;
  42.     }
  43.     private TreeNode findMin(TreeNode node) {
  44.         while (node.left != null) {
  45.             node = node.left;
  46.         }
  47.         return node;
  48.     }
  49. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4