二叉树遍历:
前序遍历: 本身 左子树 右子树
中序遍历: 左子树 本身 右子树 从小到大排列
后续遍历: 左子树 右子树 本身

二叉树前驱: 当前节点左子树最大的节点
二叉树后继: 当前节点右子树最小的节点

import javax.swing.plaf.InsetsUIResource;public class MyBST <E extends Comparable<E>> {private class Node {public E e;public Node left, right;public Node(E e) {this.e = e;this.left = null;this.right = null;}}private Node root;private int size;public MyBST() {this.root = null;this.size = 0;}public void add(E e) {root = add(root, e);}// 返回插入后的根节点private Node add(Node node, E e) {if (node == null) {size++;return new Node(e);}if (e.compareTo(node.e) < 0) {node.left = add(node.left, e);} else if (e.compareTo(node.e) > 0) {node.right = add(node.right, e);}return node;}// 典型的添加错误
//    private void add(Node node, E e) {//        if (node == null) {//            size++;
//            下面这条语句仅仅让node指向了一个新的地址 但是并没有把这个节点与二叉树连接起来
//            node = new Node(e);
//            return;
//        }
//        if (e.compareTo(node.e) < 0)
//            add(node.left, e);
//        if (e.compareTo(node.e) > 0)
//            add(node.right, e);
//    }// preOrder 前序遍历public void preOrder() {preOrder(root);System.out.println("Null");}private void preOrder(Node node) {if (node == null)return;System.out.print(node.e + "->");preOrder(node.left);preOrder(node.right);}// inOrder 中序遍历public void inOrder() {inOrder(root);System.out.println("Null");}private void inOrder(Node node) {if (node == null)return;inOrder(node.left);System.out.print(node.e + "->");inOrder(node.right);}// postOrder 后续遍历public void postOrder() {postOrder(root);System.out.println("Null");}private void postOrder(Node node) {if (node == null)return;postOrder(node.left);postOrder(node.right);System.out.print(node.e + "->");}// 返回当前以node为根的二叉树的最小值public E minimum() {if (size == 0)throw new IllegalArgumentException("BST is empty");return minimum(root).e;}private Node minimum(Node node) {if (node.left == null) {return node;}return minimum(node.left);}public void removeMin() {removeMin(root);}private Node removeMin(Node node) {if (node.left == null) {Node rightNode = node.right;node.right = null;return rightNode;}node.left = removeMin(node.left);return node;}// 返回已node为根的二叉树的最大值public E maximum() {if (size == 0)throw  new IllegalArgumentException("BST is empty");return maximum(root).e;}private Node maximum(Node node) {if (node.right == null)return node;return maximum(node.right);}// 删除最大元素public E removeMax() {E e = maximum();root = removeMax(root);return e;}private Node removeMax(Node node) {if (node.right == null) {Node leftNode = node.left;node.left = null;return leftNode;}node.right = removeMax(node.right);return node;}// 删除任意元素public void remove(E e) {root = remove(root, e);}private Node remove(Node node, E e) {if (node == null)return null;if (e.compareTo(node.e) == 0) {if (node.left == null) {Node rightNode = node.right;node.right = null;return rightNode;} else if (node.right == null) {Node leftNode = node.left;node.left = null;return leftNode;} else {Node precursor = maximum(node.left);precursor.left = removeMax(node.left);precursor.right = node.right;node.left = node.left = null;return precursor;}} else if (e.compareTo(node.e) < 0) {node.left = remove(node.left, e);} else {node.right = remove(node.right, e);}return node;}public boolean contains(E e) {return contains(root, e);}private boolean contains(Node node, E e) {if (node == null) {return false;}if (e.compareTo(node.e) == 0) {return true;}if (e.compareTo(node.e) < 0) {return contains(node.left, e);} else {return contains(node.right, e);}}public static void main(String[] args) {MyBST myBST = new MyBST();int[] arr = {5,3,6,4,1};for (int a : arr) {myBST.add(a);}myBST.inOrder();myBST.postOrder();}}

BST 递归实现二叉树: 插入 删除 查找相关推荐

  1. 顺序表的插入删除查找遍历

    顺序表的插入删除查找遍历 文章目录 顺序表的插入删除查找遍历 代码 运行结果截图 代码 #define Maxsize 100typedef int ElemType; typedef struct{ ...

  2. 二叉搜索树-php实现 插入删除查找等操作

    二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的 ...

  3. C语言 红黑树插入/删除/查找/遍历

    1 红黑树介绍 红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树. 红黑树是特殊的二叉查找树,意味着它满足二叉查找树的特征:任意一个节点所包含的键值,大于等于左孩子 ...

  4. 顺序表插入删除查找操作

    线性表实验 一.实验目的 1.掌握线性表的顺序存储结构 2.验证顺序表及其基本操作的实现 3.理解算法与程序的关系们能够将顺序表算法转换为对应的程序 二.实验步骤 1.建立含有若干个元素的顺序表 2. ...

  5. 静态顺序表创建,初始化,插入,删除,查找

    #include<stdlib.h> #define MaxSize 20 typedef struct {int data[MaxSize];int length; }sqlist; / ...

  6. 【数据结构与算法】之双向链表的创建/遍历/插入/删除/查找的算法实现

    双向链表简介 双向链表是数据结构中重要的结构,也是线性结构中常用的数据结构,双向指针,方便用户从首结点开始沿指针链向后依次遍历每一个结点,结点的前驱和后继查找方便. 其实双向链表和单向链表也是有很多相 ...

  7. 几张动态图弄懂递归,二叉树,二分查找简短算法

    一循环 最简单的 while 循环 带 if/else 的循环 二.递归 递归概念的直接演示 递归的代码示例 递归求斐波那契数列 递归求阶乘 三.按值传递和按引用传递 按值传递和按引用传递的区别 四. ...

  8. 数据结构(8-3)二叉排序树(查找、插入删除)

    目录 一.基础理论 1.特点: 2.结构: 二.查找 三.插入 四.删除 1.被删除的结点D是叶子结点 2.被删除的结点D仅有一个孩子 2-1.删除结点14(有左无右) 2-2.删除结点 10 (有右 ...

  9. 一种基于平衡二叉树(AVL树)插入、查找和删除的简易图书管理系统

    目录 1. 需求分析 2. 项目核心设计 2.1 结点插入 2.2 结点删除 3 测试结果 4 总结分析 4.1 调试过程中的问题是如何解决的,以及对设计与实现的回顾讨论和分析 4.2 算法的时间和空 ...

最新文章

  1. 云计算与边缘计算协同发展的一些思考
  2. Too many connections解决方法
  3. Ubuntu 16.04工具栏靠下设置
  4. 现代软件工程 作业 4 个人作业
  5. 分布式事务的解决思路与方案
  6. vue中富文本编辑器vue-quill-editor在vue中自定义选择视频插入编辑文章中
  7. 【Elasticsearch】ES 慢查询 profile 参数
  8. iOS进阶(XML、JSON数据解析)
  9. 无法连接远程计算机,远程桌面由于以下原因之一无法连接到远程计算机
  10. 网页视频之H5+Mse
  11. 三星android版本升级包下载,三星oneui3.0系统
  12. AI2021下载 Illtrator2021安装教程
  13. 能源行业的作业成本法管理
  14. C/C++:打印乘法口诀表
  15. 编写宠物dog类python_Python编程:创建和使用类
  16. docker _port is already allocated错误
  17. Eclipse插件10
  18. midi java_Java程序中添加播放MIDI音乐功能的实现方法详解
  19. Android CMWAP和CMNET 切换APN
  20. 计算机画画作品 人物 游泳,幼儿人物画图片游泳的人

热门文章

  1. 30天自制操作系统——第12-13天实验总结
  2. python中、不论类的名字是什么、构造方法的名字都是( )_2020年《python程序设计》基础知识及程序设计598题GA[含参考答案]...
  3. 聊聊MySQL中的锁
  4. 特定领域软件架构(DSSA)
  5. kubernetes1.4 基础篇:Learn Kubernetes 1.4 by 6 steps(2):Step 1. Create a Kubernetes cluster
  6. 真实版《华尔街之狼》
  7. Minecraft Fabric 教程 #6 添加合成表
  8. adc0809引脚图及功能详解
  9. sql删除或清空表数据
  10. Photoshop CC油画滤镜实例教程讲解