package com.interview.algorithms.general; /** * Created_By: stefanie * Date: 14-10-24 * Time: 下午3:47 */ public class C1_13_TrackingMedian_BinarySearchTree { static class Node{ int v; Node left; Node right; int size = 1; Node(int v) { this.v = v; } int leftSize(){ return this.left == null? 0 : this.left.size; } int rightSize(){ return this.right == null? 0 : this.right.size; } } Node root; public void add(int element){ if(root == null) root = new Node(element); else { if(element < root.v) root.left = insert(root.left, element); else root.right = insert(root.right, element); if(Math.abs(root.leftSize() - root.rightSize()) > 1){ //need balance Node median; if(root.leftSize() > root.rightSize()){ median = getMax(root.left); deleteMax(root.left); root.right = insert(root.right, root.v); } else { median = getMin(root.right); deleteMin(root.right); root.left = insert(root.left, root.v); } median.left = root.left; median.right = root.right; median.size = median.leftSize() + median.rightSize(); root = median; } } } private Node insert(Node node, int element){ if(node == null) return new Node(element); else if(element < node.v) node.left = insert(node.left, element); else node.right = insert(node.right, element); node.size ++; return node; } private Node getMax(Node node){ while(node.right != null) node = node.right; return node; } private Node deleteMax(Node node){ if(node.right == null) return node.left; else { node.right = deleteMax(node.right); node.size--; return node; } } private Node getMin(Node node){ while(node.left != null) node = node.left; return node; } private Node deleteMin(Node node){ if(node.left == null) return node.right; else { node.left = deleteMin(node.left); node.size--; return node; } } public int median(){ return root == null? 0 : root.v; } }