二叉排序树:所有左子树小于根节点值,所有右子树值大于根节点,采用中序遍历可以从小到大排序。本代码包含常用的插入和两种删除操作实现
package BTreeSort;
public class BNode {
public BNode lchild;
public BNode rchild;
public int data;
public BNode(){
}
public BNode(int data){
this.data = data;
}
}
package BTreeSort;
import java.util.Scanner;
public class BTreeBuild {
<span style="white-space:pre"> </span>private BNode tree;
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>public BTreeBuild(){
<span style="white-space:pre"> </span>tree = null;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>public BNode getTree() {
<span style="white-space:pre"> </span>return tree;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public BNode setTree() {
<span style="white-space:pre"> </span>Scanner read = new Scanner(System.in);
<span style="white-space:pre"> </span>int len = 5;
<span style="white-space:pre"> </span>while(len > 0){
<span style="white-space:pre"> </span>int key = read.nextInt();
<span style="white-space:pre"> </span>this.tree = insert(tree,key);
<span style="white-space:pre"> </span>len--;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>read.close();
<span style="white-space:pre"> </span>return tree;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public BNode insert(BNode tree,int key){
<span style="white-space:pre"> </span>if(null == tree){
<span style="white-space:pre"> </span>tree = new BNode();
<span style="white-space:pre"> </span>tree.data = key;
<span style="white-space:pre"> </span>}else if(tree.data > key){
<span style="white-space:pre"> </span>tree.lchild = insert(tree.lchild, key);
<span style="white-space:pre"> </span>}else if(tree.data < key){
<span style="white-space:pre"> </span>tree.rchild = insert(tree.rchild, key);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>return tree;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>public void delete(int key){
<span style="white-space:pre"> </span>BNode trees = this.tree;
<span style="white-space:pre"> </span>this.tree = delete(trees,key);
<span style="white-space:pre"> </span>}<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>public BNode delete(BNode tree, int key){
<span style="white-space:pre"> </span>//如果有左子树,则找到待删节点P的中序前驱S(即左子树的最右边的节点),用P.lchild取代P,P.rchild作为S.rchild
<span style="white-space:pre"> </span>if(tree != null){
<span style="white-space:pre"> </span>if(tree.data == key){
<span style="white-space:pre"> </span>//tree = DelNode(tree);
<span style="white-space:pre"> </span>tree = DelNode2(tree);
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>}else if(tree.data > key){
<span style="white-space:pre"> </span>tree.lchild = delete(tree.lchild,key);
<span style="white-space:pre"> </span>}else if(tree.data < key){
<span style="white-space:pre"> </span>tree.rchild = delete(tree.rchild,key);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>return tree;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>public BNode DelNode2(BNode tree){
<span style="white-space:pre"> </span>if(tree.lchild != null){
<span style="white-space:pre"> </span>BNode r = tree.lchild;
<span style="white-space:pre"> </span>BNode pre = tree.lchild;
<span style="white-space:pre"> </span>while(r.rchild != null){
<span style="white-space:pre"> </span>pre = r;
<span style="white-space:pre"> </span>r = r.rchild;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>if(pre != r){
<span style="white-space:pre"> </span>pre.rchild = r.lchild;
<span style="white-space:pre"> </span>r.lchild = tree.lchild;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>r.rchild = tree.rchild;
<span style="white-space:pre"> </span>return r;
<span style="white-space:pre"> </span>}else{
<span style="white-space:pre"> </span>BNode q = tree.rchild;
<span style="white-space:pre"> </span>tree = null;
<span style="white-space:pre"> </span>return q;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>public BNode DelNode(BNode tree){
<span style="white-space:pre"> </span>if(tree.lchild != null){
<span style="white-space:pre"> </span>BNode r = tree.lchild;
<span style="white-space:pre"> </span>while(r.lchild != null){
<span style="white-space:pre"> </span>r = r.rchild;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>r.rchild = tree.rchild;
<span style="white-space:pre"> </span>return tree.lchild;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>else{
<span style="white-space:pre"> </span>return tree.rchild;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>public void print(){//打印输出
<span style="white-space:pre"> </span>BNode trees = this.tree;
<span style="white-space:pre"> </span>print(trees);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>public void print(BNode tree){//中序遍历
<span style="white-space:pre"> </span>if(tree == null){
<span style="white-space:pre"> </span>return;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>print(tree.lchild);
<span style="white-space:pre"> </span>System.out.println(tree.data);
<span style="white-space:pre"> </span>print(tree.rchild);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public static void main(String [] args){
<span style="white-space:pre"> </span>BTreeBuild bb = new BTreeBuild();
<span style="white-space:pre"> </span>bb.setTree();
<span style="white-space:pre"> </span>bb.delete(2);
<span style="white-space:pre"> </span>bb.print();
<span style="white-space:pre"> </span>}
}