二叉搜索树

Java 实现的二叉搜索树 包括查找、插入、删除,前序、中序、后序遍历的递归与栈实现

package tree;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Stack;

public class Tree {
	private TreeNode root;

	public Tree() {
		this.root = null;
	}

	public void insert(TreeNode node) {
		if (this.root == null) {
			this.root = node;
			return;
		}
		TreeNode parent = this.root;
		TreeNode temp = parent;
		while (parent != null) {
			temp = parent;
			if (node.getData() < parent.getData()) {
				parent = parent.getLeft();
			} else {
				parent = parent.getRight();
			}
		}
		parent = temp;
		node.setParent(parent);
		if (node.getData() < parent.getData()) {
			parent.setLeft(node);
		} else {
			parent.setRight(node);
		}
	}

	public void delete(TreeNode node) {
		if (node.getLeft() == null) {
			this.transplant(node, node.getRight());
		} else if (node.getRight() == null) {
			this.transplant(node, node.getLeft());
		} else {
			TreeNode find = this.findMin(node.getRight());
			if (find.getParent() != node) {
				this.transplant(find, find.getRight());
				find.setRight(node.getRight());
				find.getRight().setParent(find);
			}
			this.transplant(node, find);
			find.setLeft(node.getLeft());
			find.getLeft().setParent(find);
		}
	}

	private void transplant(TreeNode u, TreeNode v) {
		// 未处理v.left和v.right
		if (u.getParent() == null) {
			this.root = v;
		} else if (u == u.getParent().getLeft()) {
			u.getParent().setLeft(v);
		} else {
			u.getParent().setRight(v);
		}
		if (v != null) {
			v.setParent(u.getParent());
		}
	}

	public TreeNode search(int data) {
		TreeNode find = this.root;

		while (find != null && find.getData() != data) {
			if (data < find.getData()) {
				find = find.getLeft();
			} else {
				find = find.getRight();
			}
		}

		return find;
	}

	public TreeNode findMin(TreeNode node) {
		TreeNode find = node;
		if (find.getLeft() != null) {
			find = find.getLeft();
		}
		return find;
	}

	public TreeNode findMax(TreeNode node) {
		TreeNode find = node;
		if (find.getRight() != null) {
			find = find.getRight();
		}
		return find;
	}

	public TreeNode getSuccessor(TreeNode node) {
		if (node.getRight() != null) {
			return this.findMin(node.getLeft());
		}
		TreeNode find = node;
		TreeNode parent = find.getParent();
		while (parent != null && find == parent.getRight()) {
			find = parent;
			parent = find.getParent();
		}
		return parent;
	}

	public ArrayList<TreeNode> bfs() {
		ArrayList<TreeNode> ret = new ArrayList<>();
		LinkedList<TreeNode> go = new LinkedList<>();
		HashMap<TreeNode, Boolean> visited = new HashMap<>();
		visited.put(this.root, true);
		go.add(root);
		ret.add(root);

		while (go.size() != 0) {
			TreeNode temp = go.removeFirst();
			if (temp.getLeft() != null && !visited.containsKey(temp.getLeft())) {
				visited.put(temp.getLeft(), true);
				go.add(temp.getLeft());
				ret.add(temp.getLeft());
			}
			if (temp.getRight() != null && !visited.containsKey(temp.getRight())) {
				visited.put(temp.getRight(), true);
				go.add(temp.getRight());
				ret.add(temp.getRight());
			}
		}
		return ret;
	}

	public ArrayList<TreeNode> dfs() {
		ArrayList<TreeNode> ret = new ArrayList<>();

		Stack<TreeNode> go = new Stack<>();
		HashMap<TreeNode, Boolean> visited = new HashMap<>();
		visited.put(this.root, true);
		go.push(root);
		ret.add(root);

		while (!go.isEmpty()) {
			TreeNode temp = go.peek();
			if (temp.getLeft() != null && !visited.containsKey(temp.getLeft())) {
				visited.put(temp.getLeft(), true);
				go.push(temp.getLeft());
				ret.add(temp.getLeft());
				continue;
			}
			if (temp.getRight() != null && !visited.containsKey(temp.getRight())) {
				visited.put(temp.getRight(), true);
				go.add(temp.getRight());
				ret.add(temp.getRight());
				continue;
			}
			go.pop();
		}

		return ret;
	}

	public void preOrder(TreeNode node, ArrayList<TreeNode> ret) {
		if (node == null) {
			return;
		}
		ret.add(node);
		preOrder(node.getLeft(), ret);
		preOrder(node.getRight(), ret);
	}

	public void preOrderStack(TreeNode node, ArrayList<TreeNode> ret) {
		Stack<TreeNode> stack = new Stack<>();
		if (this.root == null) {
			return;
		}

		while (node != null || !stack.isEmpty()) {
			while (node != null) {
				stack.push(node);
				ret.add(node);
				node = node.getLeft();
			}

			node = stack.pop();
			node = node.getRight();
		}
	}

	public void inOrder(TreeNode node, ArrayList<TreeNode> ret) {
		if (node == null) {
			return;
		}
		inOrder(node.getLeft(), ret);
		ret.add(node);
		inOrder(node.getRight(), ret);
	}

	public void inOrderStack(TreeNode node, ArrayList<TreeNode> ret) {
		Stack<TreeNode> stack = new Stack<>();
		if (this.root == null) {
			return;
		}

		while (node != null || !stack.isEmpty()) {
			while (node != null) {
				stack.push(node);
				node = node.getLeft();
			}

			node = stack.pop();
			ret.add(node);
			node = node.getRight();
		}
	}

	public void postOrder(TreeNode node, ArrayList<TreeNode> ret) {
		if (node == null) {
			return;
		}
		postOrder(node.getLeft(), ret);
		postOrder(node.getRight(), ret);
		ret.add(node);
	}

	public void postOrderStack(TreeNode node, ArrayList<TreeNode> ret) {
		if (this.root == null) {
			return;
		}
		Stack<TreeNode> stack = new Stack<>();
		HashSet<TreeNode> visited = new HashSet<>();

		while (node != null) {
			stack.push(node);
			node = node.getLeft();
		}

		while (!stack.isEmpty()) {
			TreeNode cur = stack.peek();

			while (cur.getRight() != null && !visited.contains(cur)) {
				visited.add(cur);
				cur = cur.getRight();

				while (cur != null) {
					stack.push(cur);
					cur = cur.getLeft();
				}
				cur = stack.peek();
			}
			cur = stack.pop();
			ret.add(cur);
		}
	}

	public static void main(String[] args) {
		Tree tree = new Tree();
		tree.insert(new TreeNode(15));
		tree.insert(new TreeNode(6));
		tree.insert(new TreeNode(18));
		tree.insert(new TreeNode(3));
		tree.insert(new TreeNode(7));
		tree.insert(new TreeNode(2));
		tree.insert(new TreeNode(4));
		tree.insert(new TreeNode(13));
		tree.insert(new TreeNode(9));
		tree.insert(new TreeNode(17));
		tree.insert(new TreeNode(20));

		printList(tree.bfs());
		printList(tree.dfs());

		System.out.println();

		ArrayList<TreeNode> pre = new ArrayList<>();
		tree.preOrder(tree.root, pre);
		printList(pre);
		ArrayList<TreeNode> preStack = new ArrayList<>();
		tree.preOrderStack(tree.root, preStack);
		printList(preStack);

		System.out.println();

		ArrayList<TreeNode> in = new ArrayList<>();
		tree.inOrder(tree.root, in);
		printList(in);
		ArrayList<TreeNode> inStack = new ArrayList<>();
		tree.inOrderStack(tree.root, inStack);
		printList(inStack);

		System.out.println();

		ArrayList<TreeNode> post = new ArrayList<>();
		tree.postOrder(tree.root, post);
		printList(post);
		ArrayList<TreeNode> postStack = new ArrayList<>();
		tree.postOrderStack(tree.root, postStack);
		printList(postStack);

		System.out.println();

		TreeNode find = tree.search(13);
		TreeNode succ = tree.getSuccessor(find);
		System.out.println(succ.getData());

	}

	public static void printList(ArrayList<TreeNode> nodes) {
		for (TreeNode node : nodes) {
			System.out.print(node.getData() + " ");
		}
		System.out.println();
	}
}

class TreeNode {
	private int data;
	private TreeNode left;
	private TreeNode right;
	private TreeNode parent;

	public TreeNode(int data) {
		this.setData(data);
		this.setLeft(null);
		this.setRight(null);
		this.setParent(null);
	}

	public int getData() {
		return data;
	}

	public void setData(int data) {
		this.data = data;
	}

	public TreeNode getLeft() {
		return left;
	}

	public void setLeft(TreeNode left) {
		this.left = left;
	}

	public TreeNode getRight() {
		return right;
	}

	public void setRight(TreeNode right) {
		this.right = right;
	}

	public TreeNode getParent() {
		return parent;
	}

	public void setParent(TreeNode parent) {
		this.parent = parent;
	}
}