import java.util.LinkedList;
import java.util.NoSuchElementException;
import java.util.Queue;
import java.util.Stack;
//在树中,节点对应的值具备可比较性或者在构造树时树本身具有比较性,这里假设插入书中的值具有比较性
class TreeNode<T extends Comparable<? super T>>
{
private TreeNode<T> left;
private T value;
private TreeNode<T> right;
public TreeNode(T value) {
this.value = value;
this.right = null;
this.left = null;
}
public TreeNode() {
}
public TreeNode(TreeNode<T> left, T value, TreeNode<T> right) {
this.left = left;
this.value = value;
this.right = right;
}
public TreeNode<T> getLeft() {
return left;
}
public void setLeft(TreeNode<T> left) {
this.left = left;
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
public TreeNode<T> getRight() {
return right;
}
public void setRight(TreeNode<T> right) {
this.right = right;
}
}
public class MyBinaryTree<T extends Comparable<? super T>> {
private TreeNode<T> root;
private int size;
//队列用于层序遍历时压入和弹出节点
private Queue q = new LinkedList<TreeNode<T>>();
public MyBinaryTree()
{
root = null;
}
public MyBinaryTree(TreeNode<T> root)
{
this.root = root;
size = 1;
}
//插入一个节点,如果该节点的值在树中已经存在,那么就返回false,否则返回true
public boolean insert(T e)
{
if(root == null)
{
root = new TreeNode<T>(null,e,null);
size = 1;
return true;
}
if(e == null)
throw new NullPointerException();
Comparable<? super T> nodeValue = (Comparable<? super T>)e;
TreeNode<T> t = root;
TreeNode<T> parent = null;
int compareResult = 0;
while(t!=null)
{
parent = t;
compareResult = e.compareTo(t.getValue());
if(compareResult > 0)
t = t.getRight();
else if(compareResult<0)
t = t.getLeft();
else return false;
}
/*或者也能如下写法*/
/*do
{
parent = t;
compareResult = e.compareTo(t.getValue());
if(compareResult>0)
t = t.getRight();
else if(compareResult<0)
t = t.getLeft();
else return false;
}
while(t!=null);*/
TreeNode<T> node = new TreeNode<T>(null,e,null);
if(compareResult>0)
parent.setRight(node);
else
parent.setLeft(node);
size++;
return true;
}
private boolean isEmpty()
{
return size == 0;
}
public boolean delete(T value)
{
if(root == null)
throw new RuntimeException("Tree is empty");
TreeNode<T> node = getNodeByValue(value);
if(node == null)
throw new NoSuchElementException();
size --;
TreeNode<T> parent = getParent(value);
boolean isLeft = false;
if(parent != null)
{
if(parent.getLeft()==node)
{
isLeft = true;
}
}
if(node.getLeft()==null&&node.getRight()==null)
{
if(node == root)
root = null;
else
{
node = null;
if(isLeft)
parent.setLeft(null);
else parent.setRight(null);
}
return true;
}
if(node.getLeft()!=null && node.getRight()==null)
{
if(node == root)
root = root.getLeft();
else
{
parent.setLeft(node.getLeft());
node = null;
}
return true;
}
if(node.getLeft()==null && node.getRight()!=null)
{
if(node == root)
root = root.getRight();
parent.setRight(node.getRight());
node = null;
return true;
}
if(node.getLeft()!=null && node.getRight()!=null)
{
TreeNode<T> successor = getSuccessor(node);
//connect parent of current to successor insteed
if(node == root)
root = successor;
else if (isLeft)
parent.setLeft(successor);
else
parent.setRight(successor);
//connect successor to current's left child
successor.setLeft(node.getLeft());
return true;
}
return false;
}
private TreeNode<T> getSuccessor(TreeNode<T> delNode)
{
TreeNode<T> successorParent = delNode;
TreeNode<T> successor = delNode;
TreeNode<T> current = delNode.getRight(); //go to right child
while(current != null) //until no more left children
{
successorParent = successor;
successor = current;
current = current.getLeft(); //go to left child
}
if (successor != delNode.getRight()) //if successor not right child , make connections
{
successorParent.setLeft(successor.getRight());
successor.setRight(delNode.getRight());
}
return successor;
}
//获取节点值最小的节点
public TreeNode<T> getMin()
{
if(root == null)
throw new RuntimeException("Tree is empty");
TreeNode<T> t = root;
while((t.getLeft())!=null)
t = t.getLeft();
return t;
}
//获取节点值最大的节点
public TreeNode<T> getMax()
{
if(root == null)
throw new RuntimeException("Tree is empty");
TreeNode<T> t = root;
while(t.getRight()!=null)
t = t.getRight();
return t;
}
//找到节点值所对应的节点
public TreeNode<T> getNodeByValue(T value)
{
if(isEmpty())
throw new RuntimeException("the tree is empty");
if(value == null)
{
System.out.println("value is null");
throw new NullPointerException();
}
TreeNode<T> t = root;
int comp = 0;
Comparable<? super T> e = (Comparable<? super T>)value;
while(t!=null)
{
comp = e.compareTo(t.getValue());
if(comp > 0)
t = t.getRight();
if(comp < 0)
t = t.getLeft();
else return t;
}
return null;
}
//根据值找到该值所对应的父亲节点
public TreeNode<T> getParent(T value)
{
if(isEmpty())
throw new RuntimeException("Tree is empty");
if(value == null)
throw new NullPointerException();
//从根节点开始,根节点的父亲节点是null
TreeNode<T> parent = null;
TreeNode<T> t = root;
Comparable<? super T> e = (Comparable<? super T>)value;
int comp = 0;
while(t!=null&&(comp = e.compareTo(t.getValue()))!=0)
{
parent = t;
if(comp>0)
t = t.getRight();
else t = t.getLeft();
if(t == null)
{
parent = null;
}
}
return parent;
}
public void preOrder(TreeNode<T> root)
{
if(root == null)
throw new RuntimeException("empty tree");
System.out.println(root.getValue());
if(root.getLeft()!=null)
preOrder(root.getLeft());
if(root.getRight()!=null)
preOrder(root.getRight());
}
//前序遍历非递归实现
public void preOrderNoRecursive(TreeNode<T> root)
{
Stack<TreeNode<T>> stack = new Stack<TreeNode<T>>();
while(root!=null||!stack.isEmpty())
{
while(root != null)
{
System.out.println(root.getValue());
stack.push(root);
root = root.getLeft();
}
if(!stack.isEmpty())
{
root = stack.pop();
root = root.getRight();
}
}
}
public void inOrder(TreeNode<T> root)
{
if(root.getLeft()!=null)
inOrder(root.getLeft());
System.out.println(root.getValue());
if(root.getRight()!=null)
inOrder(root.getRight());
}
//中序遍历非递归实现
public void inOrderNoRecursive(TreeNode<T> root)
{
Stack<TreeNode<T>> stack = new Stack<TreeNode<T>>();
while(root!=null||!stack.isEmpty())
{
while(root!=null)
{
stack.push(root);
root = root.getLeft();
}
if(!stack.isEmpty())
{
root = stack.pop();
System.out.println(root.getValue());
root = root.getRight();
}
}
}
public void PostOrder(TreeNode<T> root)
{
if(root.getLeft()!=null)
inOrder(root.getLeft());
if(root.getRight()!=null)
inOrder(root.getRight());
System.out.println(root.getValue());
}
public void levelOrder(TreeNode<T> root)
{
if(root == null)
throw new RuntimeException("empty tree");
//先把根节点存入队列
q.add(root);
//只要队列不空,就出队,访问,然后将该出队的节点的左右非空孩子节点放入队列中
while(!q.isEmpty())
{
TreeNode<T> node = (TreeNode<T>) q.poll();
System.out.println(node.getValue());
if(node.getLeft()!=null)
q.add(node.getLeft());
if(node.getRight()!=null)
q.add(node.getRight());
}
}
public TreeNode<T> getRoot()
{
return root;
}
public static void main(String[] args)
{
MyBinaryTree<String> tree = new MyBinaryTree<String>();
tree.insert("haha");
tree.insert("hehe");
tree.insert("abab");
/*tree.insert("lala");
tree.insert("zzad");*/
TreeNode<String> root = tree.getRoot();
tree.inOrder(tree.getRoot());
tree.inOrderNoRecursive(tree.getRoot());
//tree.PostOrder(root);
//tree.inOrder(root);
}
}