JAVA数据结构与算法(五)搜索二叉树(bst)的CURD操作
它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,
则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
查找时,从根节点与要查的数对比,大则在右子树查找,小则在左子树查找
添加时类似上面查找
删除是考虑三种情况,1.如果是叶节点直接删除,父节点针变为空,2.如果只有一个孩子节点,将父节点指针指向要删除节点的孩子节点 3.如果要删的左右都有,则将左子树种的最大元素替代或者右子树的最小元素替代
具体代码如下:
public class SearchBinaryTree {
private TreeNode root;
public SearchBinaryTree(){
}
//放入
public TreeNode put(int data){
TreeNode node=null;
TreeNode parent=null;
if(root==null){
node=new TreeNode(data);
root=node;
return node;
}
node=root;
while(node!=null){
parent=node;
if(data<node.data){
node=node.leftChild;
}else if(data>node.data){
node=node.rightChild;
}else{
return node;
}
}
//添加到相应位置
node=new TreeNode(data);
if(data<parent.data){
parent.leftChild=node;
}else{
parent.rightChild=node;
}
node.parent=parent;
return node;
}
//删除
public TreeNode delete(TreeNode node){
if(node.leftChild==null&&node.rightChild==null){ //节点无左也无右孩子节点
TreeNode parent=node.parent;
if(node==parent.leftChild){
parent.leftChild=null;
}else{
parent.rightChild=null;
}
return root;
}
if(node.leftChild==null&&node.rightChild!=null){ //节点左孩子节点为空,右孩子节点不为空
TreeNode parent=node.parent;
if(node==parent.leftChild){
parent.leftChild=node.rightChild;
node.rightChild.parent=parent;
}else{
parent.rightChild=node.rightChild;
node.rightChild.parent=parent;
}
return root;
}
if(node.leftChild!=null&&node.rightChild==null){ //节点的左孩子不为空,右孩子为空
TreeNode parent=node.parent;
if(node==parent.leftChild){
parent.leftChild=node.leftChild;
node.leftChild.parent=parent;
}else{
parent.rightChild=node.leftChild;
node.leftChild.parent=parent;
}
return root;
}
if(node.leftChild!=null&&node.rightChild!=null){ //节点的左右孩子节点都非空,则删除后继节点,并用后继节点取代该节点
TreeNode successnode=successor(node);
delete(successnode);
node.data=successnode.data;
}
return root;
}
//求后继节点
public TreeNode successor(TreeNode node){
if(node.rightChild!=null){
TreeNode minnode=node.rightChild;
while(minnode.leftChild!=null){
minnode=minnode.leftChild;
}
return minnode;
}else{
TreeNode parentnode=node.parent;
while(parentnode!=null&&node==parentnode.rightChild){
node=parentnode;
parentnode=parentnode.parent;
}
return parentnode;
}
}
//查找
public TreeNode search(int data){
TreeNode node=root;
while(node!=null&&node.data!=data){
if(data<node.data){
node=node.leftChild;
}else{
node=node.rightChild;
}
}
return node;
}
//改变
public void update(int olddata,int newdata){
delete(search(olddata));
put(newdata);
}
//中序
public void inOrder(TreeNode head){
if(head==null){
return;
}
inOrder(head.leftChild);
System.out.println(head.getData()+" ");
inOrder(head.rightChild);
}
public static void main(String[] args) {
SearchBinaryTree binarytree=new SearchBinaryTree();
int [] arr={50,30,20,40,10,70,80,90};
for(int i:arr){
binarytree.put(i);
}
binarytree.inOrder(binarytree.root);
binarytree.delete(binarytree.search(70)); //删除70
binarytree.inOrder(binarytree.root);
binarytree.update(50, 60);
binarytree.inOrder(binarytree.root);
}
class TreeNode{
private int data;
private TreeNode leftChild;
private TreeNode rightChild;
private TreeNode parent;
private TreeNode root;
public TreeNode(int data) {
super();
this.data = data;
}