潍坊市论坛

注册

 

发新话题 回复该主题

敲黑板数据结构精讲之二分搜索树 [复制链接]

1#

童鞋们好!今天,我们来学习面试常考知识点:数据结构之二分搜索树!记得做好笔记哦!

关于二分搜索树

二分搜索树是一颗二叉树,满足二叉树的所有定义。

二分搜索树每个节点左子树值都小于该节点值,每个节点右子树值都大于该节点值。

任意节点每颗子树都满足二分搜索树定义。

二分搜索树如此定义的意义何在?

二分搜索树实际上是做数据整理。因为左右子树的值和根节点关系,我们每次查找元素在根节点进行对比后,每次几乎能排除掉近一半的查找范围,大大加快了查询速度。插入元素时也一样,比如,如果我们知道超市二楼卖水果,就不用在一楼找了,大大加快了购买速度。

为了达到这样的高效,树结构也需要每个节点间具备可比较性。而链表数据结构就没有这类要求,所以有得必有失。

定义二分搜索树类

向上滑动阅览

publicclassBinarySearchTreeE{

//节点内部类

privatestaticclassNodeE{

Eelement;//当前节点

NodeEleft;//左子节点

NodeEright;//右子节点

NodeEparent;//父节点

publicNode(Eelement,NodeEparent){

this.element=element;

this.parent=parent;

}

}

}

添加属性及相应接口;

向上滑动阅览

publicclassBinarySearchTreeE{privateintsize;//记录个数privateNodeEroot;//根节点//树的大小publicintsize(){returnsize;}//是否为空的方法publicbooleanisEmpty(){returnsize==0;}//添加节点方法publicvoidadd(Eelement){}//节点内部类privatestaticclassNodeE{Eelement;//当前节点NodeEleft;//左子节点NodeEright;//右子节点NodeEparent;//父节点publicNode(Eelement,NodeEparent){this.element=element;this.parent=parent;}}}

因二分搜索树节点不能为null,所以添加判断方法;

向上滑动阅览

publicclassBinarySearchTreeE{

privateintsize;//记录个数

privateNodeEroot;//根节点

//树的大小

publicintsize(){

returnsize;

}

//是否为空的方法

publicbooleanisEmpty(){

returnsize==0;

}

//添加节点方法

publicvoidadd(Eelement){}

//判断节点不能为null

privatevoidelementCheckNull(Eelement){

if(element==null){

thrownewIllegalArgumentException("elementmustnotbenull");

}

}

//节点内部类

privatestaticclassNodeE{

Eelement;//当前节点

NodeEleft;//左子节点

NodeEright;//右子节点

NodeEparent;//父节点

publicNode(Eelement,NodeEparent){

this.element=element;

this.parent=parent;

}

}

}

add方法,添加节点设计。添加步骤如下:

找到父节点

创建新节点node

parent.left=node或parent.right=node

相等的值怎么处理?方案:return或覆盖

向上滑动阅览

publicclassBinarySearchTreeE{

...

//添加节点方法

publicvoidadd(Eelement){

//判断添加的是否为空

elementCheckNull(element);

//添加的是第一个节点

if(root==null){

root=newNode(element,null);

size++;

return;

}

//添加的不是第一个节点

//定义一个父节点

NodeEparent=root;

NodeEnode=root;

int

分享 转发
TOP
发新话题 回复该主题