public Node(int data, Node left, Node right, Node parent) { this.data = data; this.left = left; this.right = right; this.parent = parent; }
public Node buildtree(int[] arr) { foreach (int i in arr) root = insert(root, i, null); return root; }
static Node FindKthClosestSucc(Node node, int k, List<int> closest) { if (node == null) return null; if(k == 0) return node; if (node.right != null) { Node min = minNode(node.right); if (min != null) closest.Add(min.data); return FindKthClosestSucc(min, k - 1, closest); } else { Node parent = node.parent; while (parent != null && parent.right == node) { node = parent; parent = node.parent; } if (parent != null) closest.Add(parent.data); return FindKthClosestSucc(parent, k - 1, closest); } }
static Node FindKthClosestPred(Node node, int k, List<int> closest) { if (node == null) return null; if (k == 0) return node; if (node.left != null) { Node max = maxNode(node.left); if (max != null) closest.Add(max.data); return FindKthClosestPred(max, k - 1, closest); } else { Node parent = node.parent; while (parent != null && parent.left == node) { node = parent; parent = node.parent; } if (parent != null) closest.Add(parent.data); return FindKthClosestPred(parent, k - 1, closest); } }
public static void KthClosest(Node node, int data, int k) { Node cur = findNode(node, data); List<int> closest = new List<int>(); Node KthSucc = FindKthClosestSucc(cur, k, closest); Node KthPred = FindKthClosestPred(cur, k, closest); Console.WriteLine("K succs and preds: "); foreach (int i in closest) Console.Write("{0} ", i); }
public Node insert(Node node, int data, Node parent) { if (node == null) return new Node(data, parent); else { if (node.data < data) node.right = insert(node.right, data, node); else node.left = insert(node.left, data, node); return node; } }
public Node(int data, Node parent) : this(data, null, null, parent) { }
static Node findNode(Node node, int data) { if (node == null) return null; if (node.data == data) return node; if (node.data < data) return findNode(node.right, data); else return findNode(node.left, data); }
static Node minNode(Node node) { while (node.left != null) node = node.left; return node; }
static Node maxNode(Node node) { while (node.right != null) node = node.right; return node; }