我的问题是如何将此函数对转换为单个非递归调用?据我了解,任何递归调用都可能变成产生相同结果的迭代算法。
public void insert(Key key, Value value){
root = insert(root, key, value);
root.color = BLACK;
}
private Node insert(Node h, Key key, Value value) {
/*1*/ if (h == null) return new Node(key, value);
/*2*/ if (isRed(h.left) && isRed(h.right)) colorFlip(h);
/*3*/ int cmp = key.compareTo(h.key);
/*4*/ if (cmp == 0) h.val = value;
/*5*/ else if (cmp < 0) h.left = insert(h.left, key, value);
/*6*/ else h.right = insert(h.right, key, value);
/*7*/ if (isRed(h.right) && !isRed(h.left)) h = rotateLeft(h);
/*8*/ if (isRed(h.left) && isRed(h.left.left)) h = rotateRight(h);
return h;
}
我看到第 2 行在将节点推入堆栈时对其进行评估。我还注意到在第 5 行和第 6 行中,一个节点被推送到用户定义的堆栈上。当我开始思考第 7 行和第 8 行将出现的位置以及如何弹出节点并将它们正确链接到左侧或正确的指针。