搜了一圈没找到Java的非递归方法,就自己写了。
private class Node{
K key;
V value;
Node left;
Node right;
Node(K key, V value){
this.key = key;
this.value = value;
this.left = this.right = null;
}
private Node insert(Node node, K key, V value){
//结束递归的条件,如果节点为空,就创建一个节点并把它返回
if(node == null){
size ++;
return new Node(key, value);
}
//如果已经有了这个键,就把它对应的值修改为新传入的值
if(node.key == key)
node.value = value;
else if(node.key.compareTo(key) > 0)//传入的键小于当前的节点key就去左子树
node.left = insert(node.left, key, value);
else //node.key < key//大于就去右子树
node.right = insert(node.right, key, value);
//递归完成后返回节点,这个返回不能省去,也不能提前,因为递归只在最后一次会调用上面的return,其它情况下,需要调用这一句return
return node;
}
//添加元素的非递归写法
public void insertRN(K key, V value){
//在非递归算法中,需要考虑六种情况,其中第一种根节点为空已经完成
//第一种,根节点为空
if(root == null){
root = new Node(key, value);
size++;//维护size的大小
return;
}
//这里开始使用cur节点指针,寻找符合要求的
Node cur = root;
while (cur != null){
//第二种:传入的key已经存在
if(key.compareTo(cur.key) == 0){
cur.value = value;
return;
}
//第三种:需要添加的key大于当前节点,就去它的右子树
if(key.compareTo(cur.key) > 0){
if (cur.right == null)
break;
cur = cur.right;
}
//第四种:需要添加的key小于当前节点,去左子树
else if(key.compareTo(cur.key) < 0){
if(cur.left == null)
break;
cur = cur.left;
}
}
//第五种:右子树为空
if(key.compareTo(cur.key) > 0){
cur.right = new Node(key, value);
} //第六种:左子树为空
else if(key.compareTo(cur.key) < 0){
cur.left = new Node(key, value);
}
size++;
}