概要
在前面分别介绍了”二叉查找树的相关理论知识,然后给出了二叉查找树的C和C++实现版本”。这一章写一写二叉查找树的Java实现版本。
目录
- 二叉树查找树
- 二叉查找树的Java实现
- 二叉查找树的Java测试程序
二叉查找树简介
二叉查找树(Binary Search Tree),又被称为二叉搜索树。
它是特殊的二叉树:对于二叉树,假设x为二叉树中的任意一个结点,x节点包含关键字key,节点x的key值记为key[x]。如果y是x的左子树中的一个结点,则key[y] <= key[x];如果y是x的右子树的一个结点,则key[y] >= key[x]。那么,这棵树就是二叉查找树。如下图所示:
在二叉查找树中:
(01) 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(02) 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(03) 任意节点的左、右子树也分别为二叉查找树。
(04) 没有键值相等的节点(no duplicate nodes)。
二叉查找树的Java实现
1. 二叉查找树节点的定义
1 | public class BSTree<T extends Comparable<T>> { |
BSTree是二叉树,它保护了二叉树的根节点mRoot;mRoot是BSTNode类型,而BSTNode是二叉查找树的节点,它是BSTree的内部类。BSTNode包含二叉查找树的几个基本信息:
(01) key – 它是关键字,是用来对二叉查找树的节点进行排序的。
(02) left – 它指向当前节点的左孩子。
(03) right – 它指向当前节点的右孩子。
(04) parent – 它指向当前节点的父结点。
2. 遍历
这里讲解前序遍历、中序遍历、后序遍历3种方式。
2.1 前序遍历
若二叉树非空,则执行以下操作:
(01) 访问根结点;
(02) 先序遍历左子树;
(03) 先序遍历右子树。
前序遍历代码
1 | private void preOrder(BSTNode<T> tree) { |
2.2 中序遍历
若二叉树非空,则执行以下操作:
(01) 中序遍历左子树;
(02) 访问根结点;
(03) 中序遍历右子树。
中序遍历代码
1 | private void inOrder(BSTNode<T> tree) { |
2.3 后序遍历
若二叉树非空,则执行以下操作:
(01) 后序遍历左子树;
(02) 后序遍历右子树;
(03) 访问根结点。
后序遍历代码
1 | private void postOrder(BSTNode<T> tree) { |
看看下面这颗树的各种遍历方式:
对于上面的二叉树而言,
(01) 前序遍历结果: 3 1 2 5 4 6
(02) 中序遍历结果: 1 2 3 4 5 6
(03) 后序遍历结果: 2 1 4 6 5 3
3. 查找
递归版本的代码
1 | /* |
非递归版本的代码
1 | /* |
4. 最大值和最小值
查找最大值的代码
1 | /* |
查找最小值的代码
1 | /* |
5. 前驱和后继
节点的前驱:是该节点的左子树中的最大节点。
节点的后继:是该节点的右子树中的最小节点。
查找前驱节点的代码
1 | /* |
查找后继节点的代码
1 | /* |
6. 插入
插入节点的代码
1 | /* |
注:本文实现的二叉查找树是允许插入相同键值的节点的。若想禁止二叉查找树中插入相同键值的节点,可以参考”二叉查找树(一)之 图文解析 和 C语言的实现”中的插入函数进行修改。
7. 删除
删除节点的代码
1 | /* |
8. 打印
打印二叉查找树的代码
1 | /* |
完整的实现代码
二叉查找树的Java实现文件(BSTree.java)
1 | /** |
二叉查找树的C++测试程序(BSTreeTest.java)
1 | /** |
在二叉查找树的Java实现中,使用了泛型,也就意味着支持任意类型; 但是该类型必须要实现Comparable接口。
二叉查找树的Java测试程序
上面的BSTreeTest.java是二叉查找树树的测试程序,运行结果如下:
1 | == 依次添加: 1 5 4 3 2 6 |
下面对测试程序的流程进行分析!
(01) 新建”二叉查找树”root。
(02) 向二叉查找树中依次插入1,5,4,3,2,6 。如下图所示:
(03) 遍历和查找
插入1,5,4,3,2,6之后,得到的二叉查找树如下:
前序遍历结果: 1 5 4 3 2 6
中序遍历结果: 1 2 3 4 5 6
后序遍历结果: 2 3 4 6 5 1
最小值是1,而最大值是6。
(04) 删除节点4。如下图所示:
(05) 重新遍历该二叉查找树。
中序遍历结果: 1 2 4 5 6
- 原文链接:二叉查找树(三)之 Java的实现