二叉ソートツリーの削除変更操作(削除の変更)


ツリーノード
public class BinaryTreeNode {
	String name, value;
	BinaryTreeNode parent, right, left;

	public BinaryTreeNode(BinaryTreeNode parent, BinaryTreeNode right,
			BinaryTreeNode left, String name, String value) {
		this.parent = parent;
		this.right = right;
		this.left = left;
		this.name = name;
		this.value = value;
	}
}

オペレーションツリー
import java.util.ArrayList;
import java.util.List;

public class BinaryTree {
	private BinaryTreeNode root;

	public List<String> res = new ArrayList<String>();

	public void add(StudentBean bean) {
		root = insert(bean, root, null);
	}

	public void remove(StudentBean bean) {
		BinaryTreeNode node = getNode(bean, root);
		if (node == null) {
			return;
		}
		//  
		if (node.left == null && node.right == null) {
			if (node == root) {
				root = null;
			} else {
				if (node.parent.left == node) {
					node.parent.left = null;
				} else {
					node.parent.right = null;
				}
			}
		} else if (node.left == null && node.right != null) {
			if (node == root) {
				root = node.right;
			} else {
				if (node.parent.left == node) {
					node.parent.left = node.right;
				} else {
					node.parent.right = node.right;
				}
			}
		} else if (node.left != null && node.right == null) {
			if (node == root) {
				root = node.left;
			} else {
				if (node.parent.left == node) {
					node.parent.left = node.left;
				} else {
					node.parent.right = node.left;
				}
			}
		} else {
			BinaryTreeNode leftMaxNode = node.left;
			while (leftMaxNode.right != null) {
				leftMaxNode = leftMaxNode.right;
			}
			leftMaxNode.parent.right = null;
			leftMaxNode.parent = node.parent;
			if (node.parent.left == node) {
				node.parent.left = leftMaxNode;
			} else {
				node.parent.right = leftMaxNode;
			}
			leftMaxNode.left = node.left;
			leftMaxNode.right = node.right;
		}
		node = null;
	}

	public void update(StudentBean bean) {
		BinaryTreeNode node = getNode(bean, root);
		if (node != null) {
			node.value = bean.getsClass();
		}
	}

	public List<String> printTree() {
		res.clear();
		inOrder(root);
		return res;
	}

	private BinaryTreeNode inOrder(BinaryTreeNode node) {
		if (node != null) {
			inOrder(node.left);
			// System.out.println("name=" + node.name + ", class=" +
			// node.value);
			res.add("name=" + node.name + ", class=" + node.value);
			inOrder(node.right);
		}
		return node;
	}

	private BinaryTreeNode insert(StudentBean bean, BinaryTreeNode node,
			BinaryTreeNode parent) {
		if (node == null) {
			node = new BinaryTreeNode(parent, null, null, bean.getsName(),
					bean.getsClass());
		} else {
			int greater = bean.getsName().compareTo(node.name);
			if (greater < 0) {
				node.left = insert(bean, node.left, node);
			} else if (greater > 0) {
				node.right = insert(bean, node.right, node);
			}
		}
		return node;
	}

	private BinaryTreeNode getNode(StudentBean bean, BinaryTreeNode tree) {
		BinaryTreeNode node = tree;
		while (node != null) {
			int greater = bean.getsName().compareTo(node.name);
			if (greater < 0) {
				node = node.left;
			} else if (greater > 0) {
				node = node.right;
			} else {
				return node;
			}
		}
		return null;
	}

}