博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java创建二叉搜索树,实现搜索,插入,删除操作
阅读量:6832 次
发布时间:2019-06-26

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

Java实现的二叉搜索树,并实现对该树的搜索,插入,删除操作(合并删除,复制删除)

首先我们要有一个编码的思路,大致如下:
1、查找:根据二叉搜索树的数据特点,我们可以根据节点的值得比较来实现查找,查找值大于当前节点时向右走,反之向左走!

2、插入:我们应该知道,插入的全部都是叶子节点,所以我们就需要找到要进行插入的叶子节点的位置,插入的思路与查找的思路一致。

3、删除:

1)合并删除:一般来说会遇到以下几种情况,被删节点有左子树没右子树,此时要让当前节点的父节点指向当前节点的左子树;当被删节点有右子树没有左子树,此时要让当前节点的父节点指向该右子树;当被删节点即有左子树又有右子树时,我们可以找到被删节点的左子树的最右端的节点,然后让这个节点的右或者左“指针”指向被删节点的右子树
2)复制删除:复制删除相对而言是比较简单的删除操作,也是最为常用的删除操作。大致也有以下三种情况:当前节点无左子树有右子树时,让当前右子树的根节点替换被删节点;当前节点无右子树有左子树时,让当前左子树的根节点替换被删除节点;当前被删节点既有左子树又有右子树时,我们就要找到被删节点的替身,可以在被删节点的左子树中找到其最右端的节点,并让这个节点的值赋给被删节点,然后别忘了让此替身节点的父节点指向替身的“指针”为空,(其实在Java中无关紧要了,有垃圾处理机制自动进行处理)。你也可以在当前被删节点的右子树的最左端的节点作为替身节点来实现这一过程。


接下来就上代码吧。

首先是## 二叉搜索树节点类 ##

package SearchBinaryTree;public class SearchBinaryTreeNode
{ T data; public SearchBinaryTreeNode
leftChild; public SearchBinaryTreeNode
rightChild; public SearchBinaryTreeNode(){ this.data=null; this.leftChild=this.rightChild=null; } public SearchBinaryTreeNode(T da){ this.data=da; this.leftChild=this.rightChild=null; } public SearchBinaryTreeNode(T da,SearchBinaryTreeNode
left,SearchBinaryTreeNode
right){ this.data=da; this.leftChild=left; this.rightChild=right; } public T getData() { return data; } public void setData(T data) { this.data = data; } public SearchBinaryTreeNode
getLeftChild() { return leftChild; } public void setLeftChild(SearchBinaryTreeNode
leftChild) { this.leftChild = leftChild; } public SearchBinaryTreeNode
getRightChild() { return rightChild; } public void setRightChild(SearchBinaryTreeNode
rightChild) { this.rightChild = rightChild; } public boolean isLeaf(){ if(this.leftChild==null&&this.rightChild==null){ return true; } return false; }}

实现二叉搜索树

package SearchBinaryTree;public class SearchBinaryTree
{ SearchBinaryTreeNode
root; public boolean isEmpty(){ if(root==null){ return true; } return false; } public void Visit(SearchBinaryTreeNode
root){ if(root==null){ System.out.println("this tree is empty!"); } System.out.println(root.getData()); } public SearchBinaryTreeNode
getRoot(){ if(root==null){ root=new SearchBinaryTreeNode
(); } return root; } public SearchBinaryTree(){ this.root=null; } /* * 创造一颗二叉树 */ public void CreateTree(SearchBinaryTreeNode
node, T data) { if (root == null) { root = new SearchBinaryTreeNode
(); } else { if (Math.random() > 0.5) { //采用随机方式创建二叉树 if (node.leftChild == null) { node.leftChild = new SearchBinaryTreeNode
(data); } else { CreateTree(node.leftChild, data); } } else { if (node.rightChild == null) { node.rightChild = new SearchBinaryTreeNode
(data); } else { CreateTree(node.rightChild, data); } } } } /* * 在二查搜索树中进行搜索 */ public SearchBinaryTreeNode
search(SearchBinaryTreeNode
root,T value){ SearchBinaryTreeNode
current=root; while((root!=null)&&(current.getData()!=value)){ //需要注意的是java中泛型无法比较大小,在实际的使用时我们可以使用常见的数据类型来替代这个泛型,这样就不会出错了 current=(value
insertNode( T value){ SearchBinaryTreeNode
p=root,pre=null; while(p!=null){ pre=p; //需要注意的是java中泛型无法比较大小,在实际的使用时我们可以使用常见的数据类型来替代这个泛型,这样就不会出错了 if(p.getData()
(value); }else if(pre.getData()
(value); }else{ pre.leftChild=new SearchBinaryTreeNode
(value); } } /* * 合并删除 */ public void deleteByMerging(SearchBinaryTreeNode
node){ SearchBinaryTreeNode
temp=node; if(node!=null){ //若被删除节点没有右子树,用其左子树的根节点来代替被删除节点 if(node.rightChild!=null){ node=node.leftChild; }else if(node.leftChild==null){ //若被删节点没有左子树,用其有字数的最左端的节点代替被删除的节点 node=node.rightChild; }else{ //如果被删节点左右子树均存在 temp=node.leftChild; while(temp.rightChild!=null){ temp=temp.rightChild; //一直查找到左子树的右节点 } //将查找到的节点的右指针赋值为被删除节点的右子树的根 temp.rightChild=node.rightChild; temp=node; node=node.leftChild; } temp=null; } } /* * 复制删除 */ public void deleteByCoping(SearchBinaryTreeNode
node){ SearchBinaryTreeNode
pre=null; SearchBinaryTreeNode
temp=node; //如果被删节点没有右子树,用其左子树的根节点来代替被删除节点 if(node.rightChild==null){ node=node.leftChild; }else if(node.leftChild==null){ node=node.rightChild; }else{ //如果被删节点的左右子树都存在 temp=node.leftChild; pre=node; while(temp.rightChild!=null){ pre=temp; temp=temp.rightChild; //遍历查找到左子树的最右端的节点 } node.data=temp.data; //进行赋值操作 if(pre==node){ pre.leftChild=node.leftChild; }else{ pre.rightChild=node.rightChild; } } temp=null; }}

测试类

package SearchBinaryTree;public class SearchBinaryTreeTest {    public static void main(String []args){        SearchBinaryTree
tree=new SearchBinaryTree
(); for(int i=1;i<10;i++){ tree.CreateTree(new SearchBinaryTreeNode
(), i); } //搜索 tree.search(tree.root, 7); //合并删除 tree.deleteByMerging(new SearchBinaryTreeNode
(8)); //复制删除 tree.deleteByCoping(new SearchBinaryTreeNode
(6)); }}

好了,就是这样!

转载地址:http://qyikl.baihongyu.com/

你可能感兴趣的文章
DNS故障处理一例(转)
查看>>
spring WebSocket详解
查看>>
10月第4周中国五大顶级域名净增约4.2万 美国净减14.5万
查看>>
12月14日中国域名商解析量17强:易名增幅最大
查看>>
全球六大国际域名解析总量突破1.6亿 共净增48万
查看>>
HTML5+CSS3 loading 效果收集
查看>>
雅虎确认网站管理员工具 Site Explorer 将于11月21日关闭
查看>>
优质实用的开源项目推荐
查看>>
我的友情链接
查看>>
Linux服务器安全防护十个方面
查看>>
LVS+Keepalived
查看>>
SoO of EIGRP
查看>>
常用Category
查看>>
Mysql性能测试 Mysql性能
查看>>
单例模式
查看>>
搜狗输入法漏洞获取系统权限0day再述
查看>>
常见的WebPack文件、什么是WebPack
查看>>
DVD刻录机的使用与维护
查看>>
乌班图的世界——建立文件夹和空文件
查看>>
构建Postfix邮件系统(二) -- SMTP认证发信+SquirrelMail
查看>>