数据结构与算法(22)——二叉搜索树
来源:互联网 发布:电脑修复软件 编辑:程序博客网 时间:2024/05/29 09:15
二叉搜索树(BinarySearchTree)在二叉搜索树中,所有的左子树节点的元素小于根节点的元素数据,所有的右子树节点的元素大于根节点的元素数据。1.一个节点的左子树只能包含值小于该节点数据的节点2.一个节点的右子树只能包含值大于该节点数据的节点3.左右子树必须也为二叉搜索树 根 / \ 小于根的数据 大于根的数据
二叉搜索树的声明与一般二叉树声明一致,只是存储的数据不同。
完整代码,敬请参考数据结构与算法(JAVA版)
二叉搜索树的主要操作:1.在二叉搜索树中查找元素/查找最小元素/查找最大元素2.在二叉搜索树中插入元素3.在二叉搜索树中删除元素
package com.localhost.part05.tree;/** * 二叉搜索树 */public class BinarySearchTree { /** * 查找元素 * @param root 二叉搜索树的根节点 * @param data 需要查找的目标元素 * @return 目标元素的所在的节点 */ public static BinarySearchTreeNode<Integer> find(BinarySearchTreeNode<Integer> root, int data) { /* 当前节点为空直接返回空 */ if (root == null) { return null; } /* 递归查找 */ if (data > root.getData()) { return find(root.getRight(), data); } else if (data < root.getData()) { return find(root.getLeft(), data); } return root; } /** * 查找元素(非递归) * @param root 二叉搜索树的根节点 * @param data 需要查找的目标元素 * @return 目标元素的所在的节点 */ public static BinarySearchTreeNode<Integer> findNode(BinarySearchTreeNode<Integer> root, int data) { /* 当前节点为空直接返回空 */ if (root == null) { return null; } /* 遍历搜索 */ while (root != null) { if (root.getData() == data) { return root; } else if (root.getData() > data) { root = root.getLeft(); } else { root = root.getRight(); } } return null; } /** * 查找二叉搜索树中的最小元素 * @param root 二叉搜索树的根节点 * @return 最小元素节点 */ public static BinarySearchTreeNode<Integer> findMin(BinarySearchTreeNode<Integer> root) { /* 当前节点为空直接返回空 */ if (root == null) { return null; } /* 递归搜索 */ if (root.getLeft() == null) { return root; } else { return findMin(root.getLeft()); } } /** * 查找二叉搜索树中的最小元素(非递归) * @param root 二叉搜索树的根节点 * @return 最小元素节点 */ public static BinarySearchTreeNode<Integer> findMinNode(BinarySearchTreeNode<Integer> root) { /* 当前节点为空直接返回空 */ if (root == null) { return null; } /* 遍历搜索 */ while (root.getLeft() != null) { root = root.getLeft(); } return root; } /** * 查找二叉搜索树中的最大元素 * @param root 二叉搜索树的根节点 * @return 最大元素节点 */ public static BinarySearchTreeNode<Integer> findMax(BinarySearchTreeNode<Integer> root) { /* 当前节点为空直接返回空 */ if (root == null) { return null; } /* 递归搜索 */ if (root.getRight() == null) { return root; } else { return findMax(root.getRight()); } } /** * 查找二叉搜索树中的最大元素(非递归) * @param root 二叉搜索树的根节点 * @return 最大元素节点 */ public static BinarySearchTreeNode<Integer> findMaxNode(BinarySearchTreeNode<Integer> root) { /* 当前节点为空直接返回空 */ if (root == null) { return null; } /* 遍历搜索 */ while (root.getRight() != null) { root = root.getRight(); } return root; } /** * 内部方法:向二叉查找树中添加元素 * @param x 添加的元素值 * @param t 二叉查找树 * @return 添加新元素后的二叉查找树根节点 */ public static BinarySearchTreeNode<Integer> insert(int data, BinarySearchTreeNode<Integer> root) { // 如果该根节点为空,创建新的节点 if (root == null) { return new BinarySearchTreeNode<>(data); } if (data < root.getData()) { root.setLeft(insert(data, root.getLeft())); } else if (data > root.getData()) { root.setRight(insert(data, root.getRight())); } return root; } /** * 内部方法:按顺序打印二叉查找树的结点 * @param t 二叉查找树的根节点 */ public static void printTree(BinarySearchTreeNode<Integer> root) { if (root != null) { printTree(root.getLeft()); System.out.println(root.getData()); printTree(root.getRight()); } } /** * 内部方法:从子树中删除元素 * @param x 需要删除的目标元素 * @param t 子树的根节点 * @return 删除元素后的子树根节点 */ public static BinarySearchTreeNode<Integer> remove(int data, BinarySearchTreeNode<Integer> root) { // 如果子树的根节点为空,直接返回null if (root == null) { return null; } if (data < root.getData()) { root.setLeft(remove(data, root.getLeft())); } else if (data > root.getData()) { root.setRight(remove(data, root.getRight())); } else if (root.getLeft() != null && root.getRight() != null) { // 左右子树都存在,则查找右子树中最小元素 // 也可以使用左子树中最大元素代替 root.setData(findMin(root.getRight()).getData()); // 返回右子树根节点 root.setRight(remove(data, root.getRight())); } else { // 返回存在的子树 root = (root.getLeft() != null) ? root.getLeft() : root.getRight(); } return root; }}
阅读全文
0 0
- 数据结构与算法(22)——二叉搜索树
- 数据结构与算法 (二叉搜索树)
- 数据结构与算法——二叉搜索树的操作集(C语言)
- 《数据结构与算法分析(c描述)》——二叉搜索树实现
- 数据结构与算法问题 二叉搜索树
- 数据结构与算法____树, 二叉树, 二叉搜索树
- 算法与数据结构基础11:C++实现——二叉搜索树节点删除
- Python 数据结构与算法——二叉搜索树的实现
- 数据结构—二叉搜索树
- 数据结构与算法分析(Java语言描述)(16)—— 二叉搜索树基础、节点插入、查找
- 数据结构与算法分析(Java语言描述)(19)—— 二叉搜索树删除指定的节点
- 数据结构与算法分析(Java语言描述)(20)—— 二叉搜索树指定key的前驱、后继
- 数据结构与算法分析(Java语言描述)(18)—— 二叉搜索树最大、最小子节点的搜索、删除
- 《数据结构与算法分析》搜索二叉树详解
- 【数据结构与算法】二叉搜索树 及 常用操作
- 数据结构与算法之搜索二叉树<五>
- 数据结构与算法C++描述(14)---二叉搜索树
- 数据结构与算法(17)——二叉树遍历
- Java----匿名内部类与适配器模式
- 【转】OpenCV图像的轮廓的匹配
- Python运算符和表达式
- Java配置文档
- MVP设计模式的写法
- 数据结构与算法(22)——二叉搜索树
- HTTP Status 500
- h265 Nalu类型判断及 sps 数据解析
- java工具类——java将一串数据按照gzip方式压缩和解压缩
- java在线阅览pdf方法一:pdf.js
- 改变libreoffice的writer背景颜色
- openfire学习笔记二
- 无线智能风扇软件端APP设计
- Java 线程池 Executor框架(1)ThreadPoolExecutor