二叉查找树

来源:互联网 发布: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
原创粉丝点击