二叉排序树的增、删、改、查

节点定义:

public class Node{
	public int value;
	public Node left;
	public Node right;
}

二叉排序树的增:

public void add(int m) {
		Node x = new Node();
		x.value = m;
		if(tree == null) {
			tree = x;
		}else {
			Node flag = tree;
			for(;;) {
				if(m <= flag.value) {
					if(flag.left == null) {
						flag.left = x;
						break;
					}else {
						flag = flag.left;
					}
				}else {
					if(flag.right == null) {
						flag.right = x;
						break;
					}else {
						flag = flag.right;
					}
				}
			}
		}
	}

二叉排序树的查:

public String select(int index) {
		Node flag = tree;
		for(;;) {
			if(flag == null) {
				return "木有找到";
			}else if(flag.value == index) {
				return "value = "+ index +"";
			}else if(flag.value < index) {
				flag = flag.right;
			}else {
				flag = flag.left;
			}
		}
	}

二叉排序树的删:

public void delete(int index) {
		Node delparent = tree;
		Node delflag = tree;
		int isleft = 1;
		//寻找删除节点及其父节点
		for(;;) {
			//找到待删除结点及其父节点
			if(delflag.value == index) {
				Node parent = delflag;
				Node flag;
				//删除结点右侧不为空,进入右分支,寻找右分支最左侧结点
				if(delflag.right != null) {
					flag = delflag.right;
					for(;;) {
						if(flag.left != null) {
							parent = flag;
							flag = flag.left;
						}else {
							break;
						}
					}
					//找到替换节点,改变指向,也可以修改节点的值,都行
					Node temp = flag.right;
					if(delflag.left !=flag) flag.left = delflag.left;
					if(delflag.right !=flag) flag.right = delflag.right;
					if(delflag != parent) parent.left = temp;
				}else if(delflag.left != null){//左分支与右分支大致相同
					flag = delflag.left;
					for(;;) {
						if(flag.right != null) {
							parent = flag;
							flag = flag.right;
						}else {
							break;
						}
					}
					Node temp = flag.left;
					if(delflag.left !=flag) flag.left = delflag.left;
					if(delflag.right !=flag) flag.right = delflag.right;
					if(delflag != parent) parent.right = temp;
				}else {//删除节点两侧都为空时,直接删除此结点
					if(isleft == 1) {
						delparent.left = null;
					}else {
						delparent.right = null;
					}
					break;
				}
				//根据不同情况改变指向,分别为删除跟结点时,删除的是某个左节点时,删除的某个右节点时
				if(index == tree.value) {
					tree = flag;
				}else if(isleft == 1) {
					delparent.left = flag;
				}else if(isleft == 0) {
					delparent.right = flag;
				}
				break;//终止循环
			}else if(delflag.value > index) {
				delparent = delflag;
				delflag = delflag.left;
				isleft = 1;
			}else {
				delparent = delflag;
				delflag = delflag.right;
				isleft = 0;
			}
		}
	}

二叉排序树的改:

先判断是否存在此节点,存在的话删除,再进行插入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值