How it works
Remove a key from a binary search tree, replacing a two-child node with its in-order successor.
Implementation
function bstDeleteOp(state, target) { const keys = state.keys; const left = state.left; const right = state.right; let parent = -1; let current = state.root; while (current !== -1 && keys[current] !== target) { visitNode(current); compareKeys(current, target); parent = current; if (target < keys[current]) { current = left[current]; } else { current = right[current]; } } if (current === -1) { reportNotFound(); return; } reportFound(current); if (left[current] !== -1 && right[current] !== -1) { let succParent = current; let succ = right[current]; while (left[succ] !== -1) { visitNode(succ); succParent = succ; succ = left[succ]; } keys[current] = keys[succ]; updateNode(current, keys[succ]); parent = succParent; current = succ; } let child = right[current]; if (left[current] !== -1) { child = left[current]; } if (parent === -1) { state.root = child; } else if (left[parent] === current) { left[parent] = child; if (child !== -1) { linkNodes(parent, child); } } else { right[parent] = child; if (child !== -1) { linkNodes(parent, child); } } removeNode(current); finish(current); }
def bstDeleteOp(state, target): keys = state.keys left = state.left right = state.right parent = -1 current = state.root while ((current != -1) and (keys[current] != target)): visitNode(current) compareKeys(current, target) parent = current if (target < keys[current]): current = left[current] else: current = right[current] if (current == -1): reportNotFound() return reportFound(current) if ((left[current] != -1) and (right[current] != -1)): succParent = current succ = right[current] while (left[succ] != -1): visitNode(succ) succParent = succ succ = left[succ] keys[current] = keys[succ] updateNode(current, keys[succ]) parent = succParent current = succ child = right[current] if (left[current] != -1): child = left[current] if (parent == -1): state.root = child elif (left[parent] == current): left[parent] = child if (child != -1): linkNodes(parent, child) else: right[parent] = child if (child != -1): linkNodes(parent, child) removeNode(current) finish(current)
#include <vector> #include <algorithm> void bstDeleteOp(int state, int target) { auto keys = state.keys; auto left = state.left; auto right = state.right; auto parent = -1; auto current = state.root; while(((current != -1) && (keys[current] != target))) { visitNode(current); compareKeys(current, target); parent = current; if((target < keys[current])) { current = left[current]; } else { current = right[current]; } } if((current == -1)) { reportNotFound(); return; } reportFound(current); if(((left[current] != -1) && (right[current] != -1))) { auto succParent = current; auto succ = right[current]; while((left[succ] != -1)) { visitNode(succ); succParent = succ; succ = left[succ]; } keys[current] = keys[succ]; updateNode(current, keys[succ]); parent = succParent; current = succ; } auto child = right[current]; if((left[current] != -1)) { child = left[current]; } if((parent == -1)) { state.root = child; } else if((left[parent] == current)) { left[parent] = child; if((child != -1)) { linkNodes(parent, child); } } else { right[parent] = child; if((child != -1)) { linkNodes(parent, child); } } removeNode(current); finish(current); }
public void bstDeleteOp(int state, int target) { var keys = state.keys; var left = state.left; var right = state.right; var parent = -1; var current = state.root; while(((current != -1) && (keys[current] != target))) { visitNode(current); compareKeys(current, target); parent = current; if((target < keys[current])) { current = left[current]; } else { current = right[current]; } } if((current == -1)) { reportNotFound(); return; } reportFound(current); if(((left[current] != -1) && (right[current] != -1))) { var succParent = current; var succ = right[current]; while((left[succ] != -1)) { visitNode(succ); succParent = succ; succ = left[succ]; } keys[current] = keys[succ]; updateNode(current, keys[succ]); parent = succParent; current = succ; } var child = right[current]; if((left[current] != -1)) { child = left[current]; } if((parent == -1)) { state.root = child; } else if((left[parent] == current)) { left[parent] = child; if((child != -1)) { linkNodes(parent, child); } } else { right[parent] = child; if((child != -1)) { linkNodes(parent, child); } } removeNode(current); finish(current); }
#include <stdio.h> void bstDeleteOp(int state, int target) { var keys = state.keys; var left = state.left; var right = state.right; var parent = -1; var current = state.root; while(((current != -1) && (keys[current] != target))) { visitNode(current); compareKeys(current, target); parent = current; if((target < keys[current])) { current = left[current]; } else { current = right[current]; } } if((current == -1)) { reportNotFound(); return; } reportFound(current); if(((left[current] != -1) && (right[current] != -1))) { var succParent = current; var succ = right[current]; while((left[succ] != -1)) { visitNode(succ); succParent = succ; succ = left[succ]; } keys[current] = keys[succ]; updateNode(current, keys[succ]); parent = succParent; current = succ; } var child = right[current]; if((left[current] != -1)) { child = left[current]; } if((parent == -1)) { state.root = child; } else if((left[parent] == current)) { left[parent] = child; if((child != -1)) { linkNodes(parent, child); } } else { right[parent] = child; if((child != -1)) { linkNodes(parent, child); } } removeNode(current); finish(current); }