二叉排序树BST

二叉排序树的建立

创建Node结点

class Node
{
	int value;
	Node left;
	Node right;
	public Node(int value)
	{
		this.value=value;
	}
}

添加结点的方法

public void add(Node node)
{
	if(node==null)return;
	if(node.value<this.value)//添加结点值小于现结点
	{
		if(this.left==null)
		this.left=node;
		else
		this.left.add(node);//递归
	}
	else
	{
		if(this.right==null)
		this.right=node;
		else
		this.right.add(node);//递归
	}
}

中序遍历

public void infixOrder()
{
	if(this.left!=null)
	this.left.infixOrder();
	System.out.println(this);
	if(this.right!=null)
	this.right.infixOrder();
}	

综上,创建二叉排序树

class BinarySortTree
{
	private Node root;
	public void add(Node node)
	{
		if(root==null)
		root=node;
		else
		root.add(node);
	}
	public void infixOrder()
	{
		if(root!=null)
		root.infixOrder();
		else
		System.out.println("二叉排序树为空");
	}

二叉树的删除

删除叶子结点

  1. 找到要删除的结点 targetNode
  2. 找到其父结点 parent(需考虑是否存在父结点)
  3. 确定targetNode是parent的左子结点还是右子结点
    • 左子结点 parent.left=null
    • 右子结点 parent.right=null
找到要删除的结点
public Node search(int value)
{
	if(value==this.value)//找到就是当前结点
	return this;
	else if(value<this.value)//查找的值小于当前结点,向左子树递归查找
	{
		if(this.left==null)return null;
		return this.left.search(value);
	}
	else//查找的值大于当前结点,向右子树递归查找
	{
		if(this.right==null)return null;
		return this.right.search(value);
	}
}
找到要删除节点的父结点
public Node searchParent(int value)
{
	if((this.left!=null&&this.left.value==value)||(this.right!=null&&this.right.value==value))
	return this;//当前节点就是要删除的结点的父结点
	else if(value<this.value&&this.left==null)
	return this.left.searchParent(value);
	else if(value>=this.value&&this.right!=null
	return this.right.searchParent(value);
	else return null;//没有父结点
}
删除结点
public void delNode(int value)
{
	if(root==null)return;
	else
	{
		Node targetNode=search(value);
		if(targetNode==null)return;
	}
	//如果要找的点存在,又是根结点,直接置空
	if(root.left==null&&root.right==null)
	{
		root=null;
		return;
	}
	Node parent=searchParent(value);
	叶子结点
	if(targetNode.left==null&&targetNode.right==null)
	{
		//是左子结点
		if(parent.left!=null&&parent.left.value==value)
			parent.left=null;
		//是右子结点
		else if(parent.right!=null&&parent.right.value==value)
			parent.right=null;	
	}
	两棵子树
	一棵子树
}

删除有两棵子树的结点

  1. 找到要删除的结点 targetNode
  2. 找到其父结点 parent(考虑是否存在父结点)
  3. 从targetNode的右子树找到最小的结点(或左子树最大的结点)
  4. 用临时变量保存该最小结点的值
  5. 删除该最小结点
  6. targetNode.value=temp
接上
else if(targetNode.left!=null&&targetNode.right!=null)
{
	int minVal=delRightTreeMin(targetNode.right);
	targetNode.value=minVal;
}
编写方法:传入根节点,返回该树最小值并删除
public int delRightTreeMin(Node node)
{
	Node target=node;
	while(target.left!=null)
	{
		target=target.left;
	}
	delNode(target.value);
	return target.value;

删除只有一棵子树的结点

  1. 找到要删除的结点 targetNode
  2. 找到其父结点 parent(考虑是否存在父结点)
  3. 确定targetNode的子结点是左子结点还是右子结点
  4. 确定targetNode是parent的左子结点还是右子结点

由3、4可以分出四种情况:
parent.left=targetNode.left、parent.left=targetNode.right、parent.right=targetNode.left、parent.right=targetNode.left

接上
else
{
//要删除的结点不是根节点
if(targetNode!=null)
{
	//要删除的结点有左子结点
	if(targetNoode.left!=null)
	{
		//targetNode是parent左子结点
		if(parent.left.value==value)
		parent.left=targetNode.left;
		else
		parent.right=targetNode.left;
	}
}
//要删除的结点是根节点
else
root=targetNode.left;

if(targetNode!=null)
{
	//要删除的结点有右子结点
	if(targetNoode.left!=null)
	{
		//targetNode是parent左子结点
		if(parent.left.value==value)
		parent.left=targetNode.right;
		else
		parent.right=targetNode.right;
	}
}
else
root=targetNode.right;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值