博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉查找树
阅读量:6175 次
发布时间:2019-06-21

本文共 4714 字,大约阅读时间需要 15 分钟。

hot3.png

二叉查找树的特点:

1.若左子树非空,则左子树上所有结点的数据元素值均小于根结点的数据元素值。

2.若右子树非空,则右子树上所有的节点的数据元素值均大于或等于根结点的数据元素的值。

3.左右子树也均为二叉查找树

java 实现的二叉查找树:

BiTreeNode.java

public class BiTreeNode
> { private BiTreeNode
leftChild; private BiTreeNode
rightChild; private BiTreeNode
parent; private T data; public BiTreeNode() { leftChild = null; rightChild = null; } public BiTreeNode(T data){ this.data = data; leftChild = null; rightChild = null; } BiTreeNode(T data,BiTreeNode
leftChild,BiTreeNode
rightChild){ this.data = data; this.leftChild = leftChild; this.rightChild = rightChild; } public BiTreeNode
getLeftChild() { return leftChild; } public void setLeftChild(BiTreeNode
leftChild) { this.leftChild = leftChild; } public BiTreeNode
getRightChild() { return rightChild; } public void setRightChild(BiTreeNode
rightChild) { this.rightChild = rightChild; } public BiTreeNode
getParent() { return parent; } public void setParent(BiTreeNode
parent) { this.parent = parent; } public T getData() { return data; } public void setData(T data) { this.data = data; }}
BiSearchTree.java

public class BiSearchTree
> { private BiTreeNode
root; //中序遍历 private void inOrder(BiTreeNode
t,Visit vs){ if( t != null ){ inOrder(t.getLeftChild(),vs); vs.print(t.getData()); inOrder(t.getRightChild(),vs); } } //前序遍历 private void preOrder(BiTreeNode
t, Visit vs){ if(t!=null){ vs.print(t.getData()); preOrder(t.getLeftChild(),vs); preOrder(t.getRightChild(),vs); } } public BiSearchTree() { root = null; } public BiTreeNode
getRoot() { return root; } public void setRoot(BiTreeNode
root) { this.root = root; } public void inOrder(Visit vs){ inOrder(root,vs); } public void preOrder(Visit vs){ preOrder(root,vs); } //取得左孩子 public BiTreeNode
getLeft(BiTreeNode
current){ return current != null ?current.getLeftChild():null; } //取得右孩子 public BiTreeNode
getRight(BiTreeNode
current){ return current != null ? current.getRightChild() : null; } //查找 public BiTreeNode
find(T data){ if(root !=null){ BiTreeNode
temp = root; while(temp!=null){ if(temp.getData().compareTo(data)==0) return temp; if((temp.getData().compareTo(data))<0){ temp = temp.getRightChild(); } else { temp = temp.getLeftChild(); } } } return null; } public void insert(BiTreeNode
ptr,T data){ //如果插入的值小于当前节点的值,就在左子树上面插入 if(data.compareTo(ptr.getData())<0){ //如果左字树为空直接把该结点作为当前节点的左孩子,否则递归到左孩子 if(ptr.getLeftChild() == null){ BiTreeNode
temp = new BiTreeNode
(data); temp.setParent(ptr); ptr.setLeftChild(temp); }else{ insert(ptr.getLeftChild(),data); } }else if(data.compareTo(ptr.getData())>0){ if(ptr.getRightChild() == null){ BiTreeNode
temp = new BiTreeNode
(data); temp.setParent(ptr); ptr.setRightChild(temp); }else{ insert(ptr.getRightChild(),data); } } } /** * 分四种情况: * 1.删除节点没有孩子节点 * 2.删除节点只有左边孩子 * 3.删除结点只有右孩子 * 4.删除结点有左右结点 */ public void delete(BiTreeNode
ptr,T data){ if(ptr != null){ if(data.compareTo(ptr.getData())<0){ delete(ptr.getLeftChild(),data); }else if(data.compareTo(ptr.getData())>0){ delete(ptr.getRightChild(),data); }else if(ptr.getLeftChild() != null && ptr.getRightChild() !=null){//删除结点有左右结点 BiTreeNode
rightMin; //右子树最小的结点 rightMin = ptr.getRightChild(); while(rightMin.getLeftChild()!=null){ rightMin = rightMin.getLeftChild(); } ptr.setData(rightMin.getData()); delete(ptr.getRightChild(),rightMin.getData()); }else{ //左孩子为空,右孩子不为空 if(ptr.getLeftChild() == null &&ptr.getRightChild() !=null){//删除结点只有右孩子 ptr.getParent().setRightChild(ptr.getRightChild()); ptr.getRightChild().setParent(ptr.getParent()); } else if(ptr.getLeftChild() != null && ptr.getRightChild() == null){//删除节点只有左边孩子 ptr.getParent().setLeftChild(ptr.getLeftChild()); ptr.getLeftChild().setParent(ptr.getParent()); }else{//删除节点没有孩子节点 BiTreeNode
p = ptr.getParent(); if(p.getLeftChild() == ptr){ p.setLeftChild(null); }else{ p.setRightChild(null); } } } } }}

测试:

public class BiSearchTreeTest {	public static void main(String[] args) {		BiSearchTree
searchTree = new BiSearchTree
(); int a[] = {4,5,7,2,1,9,8,11,3}; Visit vs = new Visit(); BiTreeNode
root = new BiTreeNode
(a[0]); for (int i = 1; i < a.length; i++) { searchTree.insert(root, a[i]); } searchTree.setRoot(root); System.out.println("中序遍历:"); searchTree.inOrder(vs); searchTree.delete(searchTree.getRoot(), 4); System.out.println("删除4后的中序遍历:"); searchTree.inOrder(vs); }}
public class Visit { public void print(Object o){ System.out.print(o+" "); }}

转载于:https://my.oschina.net/hujunil1/blog/166802

你可能感兴趣的文章
转换PHP脚本成为windows的执行程序
查看>>
Python组织文件 实践:将带有美国风格日期的文件改名为欧洲风格日期
查看>>
实现iOS7上tableView的切割线像iOS6中的效果
查看>>
使用阿里云接口进行银行卡四要素实名认证
查看>>
聊聊excel生成图片的几种方式
查看>>
20 万网络节点背后的数据创新应用
查看>>
理论 | 朴素贝叶斯模型算法研究与实例分析
查看>>
docker安装gitlab只需要3分钟
查看>>
Android菜鸟学习js笔记 一
查看>>
Java基础之SPI机制
查看>>
使用js控制滚动条的位置
查看>>
【Tornado源码阅读笔记】tornado.web.Application
查看>>
lsyncd搭建测试
查看>>
移动web开发之像素和DPR
查看>>
nginx+tomcat+redis实现session共享
查看>>
UWP VirtualizedVariableSizedGridView 支持可虚拟化可变大小Item的View(二)
查看>>
rsync 介绍
查看>>
做一个合格的Team Leader -- 基本概念
查看>>
leetcode 190 Reverse Bits
查看>>
阿里巴巴发布AliOS品牌 重投汽车及IoT领域
查看>>