数据结构之二叉排序树或者二叉查找树(java版)

本文介绍了一个简单的二叉树操作实现,包括二叉查找树的创建、遍历及删除节点等核心功能。通过用户输入创建二叉树,并演示了如何进行前序遍历以及删除指定节点的过程。
package com.test;

import java.util.Scanner;

public class TestBintree {

	public static void main(String[] args) {

		Scanner scan = new Scanner(System.in);

		int x = scan.nextInt();
		TreeNode head = new TreeNode(x, 1, null);      //输入一个整数 ,构造第一个结点

		while (scan.hasNext()) {
			int n = scan.nextInt();
			if (n == -1) {
				System.out.println("二叉排序树创建完成");
				break;
			} else {
				create(head, n);
			}
		}

		preOrder(head);

		delete(head, 10);
		
		System.out.println();
		
		preOrder(head);
		
		
		
	}

	public static void create(TreeNode head, int n) {    // 创建二叉查找树(二叉排序树)
		int id = head.getId();
		if(n == id) {
			System.out.println("创建的值已经存在");
			return;
		}
		if (n < id) {
			if (head.getLchild() == null) {
				head.setLchild(new TreeNode(n, 2 * head.getNum(), head));
				return;
			} else {
				create(head.getLchild(), n);
			}
		} else {
			if (head.getRchild() == null) {
				head.setRchild(new TreeNode(n, 2 * head.getNum() + 1, head));
				return;
			} else {
				create(head.getRchild(), n);
			}
		}
	}

	public static void preOrder(TreeNode head) {         // 中序遍历二叉树
		if (head == null) {
			return;
		} else {
			preOrder(head.getLchild());
			System.out.print(head.getId() + ":" + head.getNum() + " ");
			preOrder(head.getRchild());
		}
	}

	public static void delete(TreeNode head, int id) {   // 删除某个节点

		while (true) {                                   //查找要删除的结点所在的位置
			if (id == head.getId()) {
				break;
			}
			if (id < head.getId()) {
				head = head.getLchild();
				if (head == null) {
					System.out.println("所要删除的结点不存在");
					return;
				}
			} else {
				head = head.getRchild();
				if (head == null) {
					System.out.println("所要删除的结点不存在");
					return;
				}
			}
		}

		TreeNode lchild = head.getLchild();
		TreeNode rchild = head.getRchild();
		TreeNode father = head.getFather();
		int num = head.getNum();

		if (num % 2 == 0) {	                                    //要删除的结点是左孩子
			if (lchild == null && rchild == null) {             //要删除的结点是叶子结点
				father.setLchild(null);
				head = null;
			} else {
				if (lchild != null && rchild == null) {         //要删除的结点是只有左孩子
					lchild.setNum(num);
					father.setLchild(lchild);
					head = null;
				} else {
					if (lchild == null && rchild != null) {     //要删除的结点只有右孩子
						rchild.setNum(num);
						father.setLchild(rchild);
						head = null;
					} else {
						head.setId(lchild.getId());            //要删除的结点既有左孩子,也有右孩子
						head.setLchild(lchild.getLchild());

						if (lchild.getRchild() != null) {
							if (rchild.getLchild() != null) {
								while (rchild.getLchild() != null) {
									rchild = rchild.getLchild();
								}
							}

							lchild.getRchild().setNum(num + 1);
							rchild.setLchild(lchild.getRchild());
						}

						lchild.setRchild(null);
						lchild.setLchild(null);
						lchild = null;
					}
				}
			}
		} else {                                                  //要删除的结点是右孩子
			if (lchild == null && rchild == null) {				  //要删除的结点是叶子结点
				father.setRchild(null);
				head = null;
			} else {
				if (lchild != null && rchild == null) {           //要删除的结点是只有左孩子
					lchild.setNum(num);
					father.setRchild(lchild);
					head = null;
				} else {
					if (lchild == null && rchild != null) {      //要删除的结点只有右孩子
						rchild.setNum(num);
						father.setRchild(rchild);
						head = null;
					} else {                                     //要删除的结点既有左孩子,也有右孩子
						head.setId(rchild.getId());
						head.setRchild(rchild.getRchild());

						if (rchild.getLchild() != null) {
							if (lchild.getRchild() != null) {
								while (lchild.getRchild() != null) {
									lchild = lchild.getRchild();
								}
							}
							rchild.getLchild().setNum(num - 1);
							lchild.setRchild(rchild.getLchild());
						}

						rchild.setRchild(null);
						rchild.setLchild(null);
						rchild = null;
					}
				}
			}
		}
	}
	
	public static boolean find(TreeNode head, int id) {  //查找某个结点,存在返回true,否则返回false
		while (true) {
			if (id == head.getId()) {
				return true;
			}
			if (id < head.getId()) {
				head = head.getLchild();
				if (head == null) {
					return false;
				}
			} else {
				head = head.getRchild();
				if (head == null) {
					return false;
				}
			}
		}
	}
	
}

class TreeNode {       //结点的结构

	private int id;
	private int num;
	private TreeNode lchild;
	private TreeNode rchild;
	private TreeNode father;

	public TreeNode(int id, int num, TreeNode father) {
		this.id = id;
		this.num = num;
		this.father = father;
	}

	public TreeNode getFather() {
		return father;
	}

	public void setFather(TreeNode father) {
		this.father = father;
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public TreeNode getLchild() {
		return lchild;
	}

	public void setLchild(TreeNode lchild) {
		this.lchild = lchild;
	}

	public TreeNode getRchild() {
		return rchild;
	}

	public void setRchild(TreeNode rchild) {
		this.rchild = rchild;
	}

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值