public bool Insert(int val) { if (root == null) { root = new btreenode(val, srwlck.CreateNew()); } btreenode btn = root; LockHelper prevLock = null; try { while (true) { btn.srwlck.EnterWrite(); prevLock = btn.srwlck; if (btn.value == val) { return true; } if (val > btn.value) { if (btn.right != null) { btn = btn.right; } else { btn.right = new btreenode(val, srwlck.CreateNew()); return true; } } else if (val < btn.value) { if (btn.left != null) { btn = btn.left; } else { btn.left = new btreenode(val, srwlck.CreateNew()); return true; } } prevLock.LeaveWrite(); } } finally { prevLock.LeaveWrite(); } }
private btreenode FindNodeAndParent(int val, btreenode btn, out btreenode parent) { btn.srwlck.EnterRead(); try { parent = null; while (btn != null) { if (btn.value == val) { return btn; } if (btn.left == null && btn.right == null) return null; if (btn.left == null && val < btn.value) return null; if (btn.right == null && val > btn.value) return null; if (btn.left != null && val < btn.value) { parent = btn; btn = btn.left; parent.srwlck.LeaveRead(); btn.srwlck.EnterRead(); } else if (btn.right != null && val > btn.value) { parent = btn; btn = btn.right; parent.srwlck.LeaveRead(); btn.srwlck.EnterRead(); } } } finally { btn.srwlck.LeaveRead(); } parent = btn; return null; }