Java实现二叉树(一):二叉查找树的实现
数据结构+算法=程序,这是共识,是真理,还是学生时代卷子中的考点。但大多数程序员往往缺乏数据结构和算法的知识,或是根本没有学过,或是学过,但在工作时频繁地与业务逻辑打交道,也就逐渐忘记了有这么一回事。
话不多说,直接开始吧,本文将介绍二叉树的基本概念,以及平衡二叉树增删改查节点的实现,由于网上关于数据结构的资料,C++相对居多,而本身作为一个Javaer,将会重新用Java实现一个平衡二叉树,仅供参考,欢迎纠正。
一、二叉树的基本概念
定义:二叉树,是一种特殊的树,二叉树的任意一个节点的度都不大于2,不包含度的节点称之为叶子。
分类:二叉树又有细分,满二叉树,以及完全二叉树,等等等等,本文就不一一介绍了,本文暂且只介绍二叉查找树,也是最常见的一种数据类型。
遍历方式:二叉树的遍历方式有三种,中序遍历,先序遍历,后序遍历:
- 中序遍历:先遍历左子树,再遍历父亲节点,最后遍历右子树;
- 先序遍历:先遍历父亲节点,再遍历左子树,最后遍历右子树;
- 后序遍历:先遍历父亲节点,再遍历右子树,最后遍历左子树;
光说显得乏味,我们列一道经典的二叉树题目吧,已知一棵二叉树,如果先序遍历的节点顺序是:ADCEFGHB ,中序遍历是:CDFEGHAB ,则后序遍历结果为:
这道题需要实现一个二叉树重构,个人的解题思路是这样的--首先,先序遍历最早遍历父亲节点,也就意味着A是根节点,而中序遍历最晚遍历右子树,所以我们可以推测出A的右边也就是B,是A的右子树。于是我们将两个去除AB,也就是DCEFGH,CDFEGH,推测父节点左子树的结果,同样的方法我们可以确定D是左子树的父亲节点,C是左子树的唯一一个左子树,从而继续去除。
说着好像十分复杂,但是其实就是一个递归的思想,不断的确认父节点,以及拆分左子树,和右子树,完成树的重构,最后得到的树是下图:
如此也就不难得出该树的后序遍历结果为:CFHGEDBA。
二、二叉查找树的基本概念
基本概念:二叉查找树是一种特殊的二叉树,要求左子树的全部节点小于父亲节点,右子树的全部节点大于父亲节点,同时,左子树和右子树也为二叉查找树,中序遍历一个二叉查找树,会得到一个有序的元素集合。
优点:二叉查找树拥有良好的查找性能,查找次数最多为树的深度,这也就意味着二叉查找树的查找效率取决于树的深度,而满二叉树的深度为log(N+1),所以此时他的查找时间复杂度为O(logN)。
缺点:缺点在优点中说的十分明确了&#x