二叉树
二叉搜索树
二叉搜索树满足条件:
- 是一个二叉树。
- 每个节点则左子节点小于该节点,右子节点大于该节点。
二叉树搜索树的添加节点
例如:4,5,10,2,7,13,8,6,9,11
删除节点
删除一个节点有三种情况:
- 该节点为叶子节点
直接删除 - 该节点只有一个子节点
该节点子节点替换为该节点。
- 该节点下有左右两个子节点
取该节点右子节点的最小叶子节点替换该节点。
代码实现二叉搜索树
package tree;
/** * @author zhw * @description * @date 2021-05-21 10:49 */
public class BinarySearchTree {
private TreeNode root;
//添加
public void add(int key,String value) {
if (root == null) {
root = new TreeNode(key, value);
return;
}
addOrModifyNode(root,key,value);
}
//获取
public String get(int key){
TreeNode node = getNode(root, key);
if(node==null){
return null;
}
return node.value;
}
//移除
public void remove(int key){
TreeNode node = getNode(root, key);
if(node==null){
return;
}
TreeNode iNode = node;
if(iNode.right!=null&&iNode.left!=null){
TreeNode n = iNode.right;
while(n!=null){
iNode = n;
n = n.left;
}
}else if(iNode.right != null){
iNode = iNode.right;
}else if(iNode.left != null){
iNode = iNode.left;
}else{
TreeNode parent = node.parent;
if(parent.key>node.key){
parent.left = null;
}else {
parent.right = null;
}
return;
}
iNode.parent.left=null;
iNode.left = node.left;
iNode.right = node.right;
TreeNode parent = node.parent;
if(parent.key>node.key){
parent.left = iNode;
}else {
parent.right = iNode;
}
}
private TreeNode getNode(TreeNode node,int key){
//如果key相同则更新
if(key==node.key){
return node;
}
if(key<=node.key){
if(node.left==null){
return null;
}
return getNode(node.left,key);
}else{
if(node.right==null){
return null;
}
return getNode(node.right,key);
}
}
private void addOrModifyNode(TreeNode node,int key,String value){
if(key == node.key){
node.value = value;
return;
}
if (key < node.key) {
//左
if(node.left==null){
TreeNode treeNode = new TreeNode(key, value);
node.left=treeNode;
treeNode.parent = node;
}else{
addOrModifyNode(node.left,key,value);
}
} else {
//右
if(node.right==null){
TreeNode treeNode = new TreeNode(key, value);
node.right=treeNode;
treeNode.parent = node;
}else{
addOrModifyNode(node.right,key,value);
}
}
}
private class TreeNode{
int key;
String value;
TreeNode parent;
TreeNode left;
TreeNode right;
public TreeNode(int key,String value){
this.key = key;
this.value = value;
}
}
}