二叉搜索树

public class BinarySearchTree {
    //内部类,代表二叉搜索树的一个节点
    private class TreeNode{
        int element;
        TreeNode left;
        TreeNode right;
    }
//  //递归搜索查找
//  public TreeNode Find(int x,TreeNode T){
//      if(T==null){
//          return null;
//      }
//      if(x<T.element){
//          return Find(x,T.left);
//      }else if(x>T.element){
//          return Find(x,T.right);
//      }else{
//          return T;
//      }
//  }
    //非递归搜索查找
    public TreeNode Find(int x,TreeNode T){
        if(T!=null){
            if(x<T.element){
                while(T.left!=null){
                    T=T.left;
                }
            }else{
                while(T.right!=null){
                    T=T.right;
                }
            }
        }
        return T;
    }
//  //递归的方式查找最小值
//  public TreeNode FindMin(TreeNode T){
//      if(T==null){
//          return null;
//      }else if(T.left==null){
//          return T;
//      }else{
//          return FindMin(T.left);
//      }
//  }
    //非递归的方式查找最小值
    public TreeNode FindMin(TreeNode T){
        if(T!=null){
            while(T.left!=null){
                T=T.left;
            }
        }
        return T;
    }
//  //递归的方式查找最大值
//  public TreeNode FindMax(TreeNode T){
//      if(T==null){
//          return null;
//      }else if(T.right==null){
//          return T;
//      }else{
//          return FindMin(T.right);
//      }
//  }
    //非递归的方式查找最大值
    public TreeNode FindMax(TreeNode T){
        if(T!=null){
            while(T.right!=null){
                T=T.right;
            }
        }
        return T;
    }
    /*
     * 二叉搜索树的插入规则:
     * 1. 如果插入前该树无任何节点,则将该节点插到根节点
     * 2. 如果该树小于要插入位置的父节点,则递归插入到该父节点的左子节点
     * 3. 如果该树大于要插入位置的父节点,则递归插入到该父节点的右子节点
     * 4. 最后将插入后的树节点返回
     */
    public TreeNode Insert(int x,TreeNode T){
        if(T==null){
            T.element=x;
            T.left=T.right=null;
        }else if(x<T.element){
            T.left=Insert(x,T.left);
        }else if(x>T.element){
            T.right=Insert(x,T.right);
        }
        return T;
    }
    /*
     * 二叉搜索树的删除规则:
     * 1. 如果节点是叶节点,则立即删除
     * 2. 如果节点有一个子节点,则删除该节点后,其子节点代替父节点(被删除的节点)的位置 
     * 3. 如果节点有两个子节点,则用其右子树的最小数据代替该节点的数据并递归地删除那个节点
     */
    public TreeNode Delete(int x,TreeNode T){
        TreeNode TmpCell;
        if(T==null){
            return null;
        }else if(x<T.element){    //如果小于该节点值,则递归删除其左子节点
            T.left=Delete(x,T.left);
        }else if(x>T.element){   //如果大于该节点值,则递归删除其右子节点
            T.right=Delete(x,T.right);
        }else if(T.left!=null&&T.right!=null){ //若被删除的节点有左右子节点,则将其右子树的最小数据代替该节点的数据,并递归删除该节点
            TmpCell=FindMin(T.right);
            T.element=TmpCell.element;
            T.right=Delete(T.element,T.right);
        }else{        //若被删除的节点只有一个子节点或者为叶节点
            TmpCell=T;
            if(T.left==null){
                T=T.right;
            }else if(T.right==null){
                T=T.left;
            }
            TmpCell=null;
        }
        return T;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值