二叉查找树
来源:互联网 发布:js图片轮播和点击切换 编辑:程序博客网 时间:2024/06/06 12:35
二叉查找树或者是棵空树,或者满足下面的特性:
(1)如果它的左子树不为空,那么它的左子树上的任意节点的值都小于根节点的值。
(2)如果它的右子树不为空,那么它的右子树上任意节点的值都大于根节点的值。
(3)同样,它的左子树和右子树也都是二叉查找树。
二叉查找树的代码实现如下:
package com.threetop.www;/** * 二叉查找树的实现 * @author wjgs * */public class BinarySearchTree{private BinaryTreeNode root;//构造函数实现初始化public BinarySearchTree(BinaryTreeNode root){this.root=root;}//**************************************************************/** * 二叉查找树的查找实现 * @param data * @return */public BinaryTreeNode search(int data){return search(root,data);}/** * 递归二叉查找树 * @param node * @param data * @return */private BinaryTreeNode search(BinaryTreeNode node ,int data){if(node==null){return null;}else if(node.getData()==data){return node;}else if(data>node.getData()){//右子树查找return search(node.getRightChild(),data);}else{//左子树查找return search(node.getLeftChild(),data);}}//************************************************************** //***************************二叉查找树的插入操作***********************************public void insert(int data){if(root==null){root=new BinaryTreeNode();root.setData(data);}else{searchAndInsert(null,root,data);}}/** * * 递归二叉查找树(如果没有找到,则新建一个最终位置的节点) * @param parent * @param node * @param data */private BinaryTreeNode searchAndInsert(BinaryTreeNode parent, BinaryTreeNode node, int data) { if(node==null){node =new BinaryTreeNode();node.setData(data);if(data>parent.getData()){//插入右子树parent.setRightChild(node);}else{//插入左子树parent.setLeftChild(node);}return node;}else if(node.getData()==data){return node;}else if(data>node.getData()){//右子树进行插入操作return searchAndInsert(node,node.getRightChild(),data);}else{ //左子树进行插入操作return searchAndInsert(node,node.getLeftChild(),data);}}//**************************************************************//****************************二叉查找树的删除操作**********************************public void delete(int data){//对于根节点直接赋予空if(root.getData()==data){root=null;return;}//整个过程需要知道父节点,因为java是引用传递,不能直接赋值BinaryTreeNode parent=searchParent(data);if(parent==null){return ;}BinaryTreeNode node=search(parent,data);//叶子节点直接删除if(node.getLeftChild()==null&&node.getRightChild()==null){if(parent.getLeftChild()!=null&&parent.getRightChild().getData()==data){parent.setLeftChild(null);}else{parent.setRightChild(null);}}//左子树不为空else if(node.getLeftChild()!=null&&node.getRightChild()==null){if(parent.getLeftChild()!=null&&parent.getLeftChild().getData()==data){//直接赋值为节点的左子树parent.setLeftChild(node.getLeftChild());}else{//直接赋值为节点的右子树parent.setRightChild(node.getLeftChild());}}//右子树不为空else if(node.getRightChild()!=null&&node.getLeftChild()==null){if(parent.getLeftChild()!=null&&parent.getLeftChild().getData()==data){parent.setLeftChild(node.getRightChild());}else{parent.setRightChild(node.getRightChild());}}//左右子树都不为空else{//1.查找右子树最左子节点BinaryTreeNode deleteNode=node;//要删除节点的右子树树根BinaryTreeNode temp=node.getRightChild();if(temp.getLeftChild()==null){temp.setLeftChild(deleteNode.getLeftChild());}else{//右子树的左孩子不为空while(temp.getLeftChild()!=null){node=temp;temp=temp.getLeftChild();}//2.继承节点右子树上移node.setLeftChild(temp.getRightChild());//3.继承节点九尾temp.setLeftChild(deleteNode.getLeftChild());temp.setRightChild(deleteNode.getRightChild());} //4.更新父节点为删除节点的原父节点 if(parent.getLeftChild()!=null&&parent.getLeftChild().getData()==data) { parent.setLeftChild(temp); }else { parent.setRightChild(temp); }}}//**************************************************************//*****************************二叉查找树查找父节点*****************************************/** * 二叉查找树查找父节点 * @param data * @return */private BinaryTreeNode searchParent(int data) {// TODO Auto-generated method stubreturn searchParent(null,root,data);}private BinaryTreeNode searchParent(BinaryTreeNode parent, BinaryTreeNode node,int data) { if(node==null){ return null;}else if(node.getData()==data){return parent;}else if(data>node.getData()){//右子树查找return searchParent(node,node.getRightChild(),data);}else{//左子树查找return searchParent(node,node.getLeftChild(),data);} }//**********************************************************************//***********************获取根节点***********************************************public BinaryTreeNode getRoot(){ return root;}}
0 0
- 查找--二叉查找树
- 二叉树、二叉查找树
- 二叉树 & 二叉查找树
- 【查找结构】二叉查找树
- 查找之二叉树查找
- 查找之二叉树查找
- 查找:二叉查找树总结
- 二叉树查找树...
- 二叉树查找树
- 查找--遍历二叉树
- 二叉查找树
- 二叉查找树实现
- 二叉查找树
- 动态二叉查找树
- 最优二叉查找树
- 二叉查找树
- 二叉查找树
- 平衡二叉查找树
- Vue.js+Vuex:一个简单的记事本
- 51Nod-1277-字符串中的最大值
- phpize建立php扩展 Cannot find config.m4. 出错原因
- 链接器工具错误 LNK1123
- maven工程开启jetty调试
- 二叉查找树
- CodeVS1702 素数判定 2
- Linux CUDA C MPI生成动态链接库
- # Redis笔记(1):安装
- [翻译] 如何更好地编写单元测试(下)
- DepthJVM-类文件结构
- 《情感机器》-读书笔记(3)
- tensorflow编程填坑笔记
- Linux命令行下载文件