二叉排序树
- 二叉排序树定义:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的结点。
- 二叉排序树的查找
private void searchNode(int data){
if(root == null){
root = new node();
root.data = data;
}else {
node p = root;
node xx = new node();
xx.data = data;
addNode(xx,p);
}
}
/**
* 查找,若不存在则插入
* @param xx 结点
* @param p 比较的结点
*/
private void addNode(node xx,node p){
if(xx.data < p.data){
if(p.lchild == null){
xx.lchild = p.lchild;
p.lchild = xx;
}else{
p = p.lchild;
addNode(xx,p);
}
}else if(xx.data > p.data){
if(p.rchild == null){
xx.rchild = p.rchild;
p.rchild = xx;
}else{
p = p.rchild;
addNode(xx,p);
}
}
}
- 二叉排序树的删除
/**
* 删除结点 ,其左右均有结点
* @param xx 需要删除的结点
*/
private void deleteNode_1(node xx,node p){
if(p != null){
if(root == xx){
root = null;
return;
}else if(p.lchild == xx){
node a = xx.lchild;
node b = xx.rchild;
p.lchild = a;
while(a.rchild != null){
a = a.rchild;
}
a.rchild = b;
}else if(p.rchild == xx){
node a = xx.lchild;
node b = xx.rchild;
p.rchild = a;
while(a.rchild != null){
a = a.rchild;
}
a.rchild = b;
}
deleteNode_1(xx,p.lchild);
deleteNode_1(xx,p.rchild);
}
}
/**
* 删除结点,其左右有一个为空或是都为空
* @param xx 需要删除的结点
*/
private void deleteNode_2(node xx,node p){
if(p != null) {
if (root == xx) {
root = null;
return;
} else if (p.lchild == xx) {
if (xx.lchild != null) {
p.lchild = xx.lchild;
} else if (xx.rchild != null) {
p.lchild = xx.rchild;
}else {
p.lchild = null;
}
} else if (p.rchild == xx) {
if (xx.lchild != null) {
p.rchild = xx.lchild;
} else if (xx.rchild != null) {
p.rchild = xx.rchild;
}else {
p.lchild = null;
}
}
deleteNode_2(xx, p.lchild);
deleteNode_2(xx, p.rchild);
}
}
- 判断删除的结点在二叉树中的状态
/**
* 判断删除结点情况
*/
private void judge(node p,int data){
if(p != null){
if(p.data == data){
if(p.lchild != null && p.rchild != null){
/* allTrue用来保存查询的结果 */
allTrue = true;
}else {
allTrue = false;
}
/* l为查找的的结点 */
l = p;
}
judge(p.lchild,data);
judge(p.rchild,data);
}
}
/******************************************** 我是分割线 ****************************************************/
- 完整代码
import java.util.Scanner;
public class balanceTree {
private Scanner sc = new Scanner(System.in);
/* 根节点 */
private node root;
/* 判断删除二叉树情况 */
private boolean allTrue;
/* 判断是否查找到指定数据 */
private boolean isSuccess = true;
/* 寻找删除的结点 */
private node l;
public static void main(String[] args) {
new balanceTree().control();
}
private void control(){
System.out.print("请输入查找的数据:");
int data = sc.nextInt();
System.out.print("请输入序列的个数:");
int num = sc.nextInt();
while(num-- > 0){
System.out.print("请输入序列:");
int dat = sc.nextInt();
if(dat == data){
System.out.println("查找成功");
isSuccess = false;
break;
}
searchNode(dat);
}
System.out.println("\n删除前:");
LDR(root);
if(isSuccess){
System.out.println("[ 序列中不存在此数据 ]");
}
System.out.print("请输入删除的结点信息:");
judge(root,sc.nextInt());
if(l != null) {
if (allTrue) {
deleteNode_1(l, root);
} else {
deleteNode_2(l, root);
}
}
System.out.println("\n删除后:");
LDR(root);
}
/**
* 寻找结点
* @param data 数据
*/
private void searchNode(int data){
if(root == null){
root = new node();
root.data = data;
}else {
node p = root;
node xx = new node();
xx.data = data;
addNode(xx,p);
}
}
/**
* 查找,若不存在则插入
* @param xx 结点
* @param p 比较的结点
*/
private void addNode(node xx,node p){
if(xx.data < p.data){
if(p.lchild == null){
xx.lchild = p.lchild;
p.lchild = xx;
}else{
p = p.lchild;
addNode(xx,p);
}
}else if(xx.data > p.data){
if(p.rchild == null){
xx.rchild = p.rchild;
p.rchild = xx;
}else{
p = p.rchild;
addNode(xx,p);
}
}
}
/**
* 删除结点 ,其左右均有结点
* @param xx 需要删除的结点
*/
private void deleteNode_1(node xx,node p){
if(p != null){
if(root == xx){
root = null;
return;
}else if(p.lchild == xx){
node a = xx.lchild;
node b = xx.rchild;
p.lchild = a;
while(a.rchild != null){
a = a.rchild;
}
a.rchild = b;
}else if(p.rchild == xx){
node a = xx.lchild;
node b = xx.rchild;
p.rchild = a;
while(a.rchild != null){
a = a.rchild;
}
a.rchild = b;
}
deleteNode_1(xx,p.lchild);
deleteNode_1(xx,p.rchild);
}
}
/**
* 删除结点,其左右有一个为空或是都为空
* @param xx 需要删除的结点
*/
private void deleteNode_2(node xx,node p){
if(p != null) {
if (root == xx) {
root = null;
return;
} else if (p.lchild == xx) {
if (xx.lchild != null) {
p.lchild = xx.lchild;
} else if (xx.rchild != null) {
p.lchild = xx.rchild;
}else {
p.lchild = null;
}
} else if (p.rchild == xx) {
if (xx.lchild != null) {
p.rchild = xx.lchild;
} else if (xx.rchild != null) {
p.rchild = xx.rchild;
}else {
p.lchild = null;
}
}
deleteNode_2(xx, p.lchild);
deleteNode_2(xx, p.rchild);
}
}
/**
* 判断删除结点情况
*/
private void judge(node p,int data){
if(p != null){
if(p.data == data){
if(p.lchild != null && p.rchild != null){
allTrue = true;
}else {
allTrue = false;
}
l = p;
}
judge(p.lchild,data);
judge(p.rchild,data);
}
}
/**
* 中序遍历
* @param xx ...
*/
private void LDR(node xx){
if(xx != null){
LDR(xx.lchild);
System.out.println("[ data = " + xx.data + " ]");
LDR(xx.rchild);
}
}
}
final class node{
int data;
node lchild;
node rchild;
}
- 记录,以供复习
若有不足,多谢指正!