私の質問は、この関数ペアを単一の非再帰呼び出しに変換するにはどうすればよいですか? 私が理解しているように、再帰呼び出しは同じ結果をもたらす反復アルゴリズムに変わる可能性があります。
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 行目がどこで発生するか、ノードをポップオフして左または右に正しくリンクする方法を考え始めると、混乱が始まります。正しいポインター。