二叉排序树的建立
创建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("二叉排序树为空");
}
二叉树的删除
删除叶子结点
- 找到要删除的结点 targetNode
- 找到其父结点 parent(需考虑是否存在父结点)
- 确定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;
}
两棵子树
一棵子树
}
删除有两棵子树的结点
- 找到要删除的结点 targetNode
- 找到其父结点 parent(考虑是否存在父结点)
- 从targetNode的右子树找到最小的结点(或左子树最大的结点)
- 用临时变量保存该最小结点的值
- 删除该最小结点
- 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;
删除只有一棵子树的结点
- 找到要删除的结点 targetNode
- 找到其父结点 parent(考虑是否存在父结点)
- 确定targetNode的子结点是左子结点还是右子结点
- 确定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;
}