二叉树的基本操作,代码如下
package 二叉树;
import java.util.ArrayList;
import java.util.List;
public class BinaryTree<E extends Comparable<E>>{
private TreeNode<E> root;
private int size;
private List<E> inorderList = new ArrayList<E>();
private List<E> preorderList = new ArrayList<E>();
private List<E> postorderList = new ArrayList<E>();
public BinaryTree(){
}
public BinaryTree(E[] objects){
for(E e : objects){
insert(new TreeNode<E>(e));
}
}
public TreeNode<E> search(E e){
TreeNode<E> current = root;
while(current != null && e.compareTo(current.element) != 0){
if(e.compareTo(current.element) < 0){
current = current.left;
}else{
current = current.right;
}
}
return current;
}
public TreeNode<E> min(TreeNode<E> x){
while(x.left != null){
x = x.left;
}
return x;
}
public TreeNode<E> max(TreeNode<E> x){
while(x.right != null){
x = x.right;
}
return x;
}
/**
* 找到节点x的后继
* @return x的后继
*/
public TreeNode<E> successor(TreeNode<E> x){
if(x.right != null){
return min(x.right);
}
TreeNode<E> y = x.parent;
while(y != null && x.element.compareTo(y.right.element) == 0){
x = y;
y = y.parent;
}
return y;
}
/**
* 找出节点x的前驱
*@return x的前驱
*/
public TreeNode<E> predecessor(TreeNode<E> x){
if(x.left != null){
return max(x.left);
}
TreeNode<E> y = x.parent;
while(y != null && x.element.compareTo(y.left.element) == 0){
x = y;
y = y.parent;
}
return y;
}
public void insert(TreeNode<E> z){
TreeNode<E> x = root;
TreeNode<E> y = null;
while(x != null){
y = x;
if(z.element.compareTo(x.element) > 0){
x = x.right;
}else{
x = x.left;
}
}
z.parent = y;
if(y == null){
root = z; // Tree was empty
}
else if(z.element.compareTo(y.element) < 0){
y.left = z;
}else{
y.right = z;
}
}
public void transplant(TreeNode<E> u, TreeNode<E> v){
if(u.parent == null){
root = v;
}
else if(u.parent.left == u){
u.parent.left = v;
}
else{
u.parent.right = v;
}
if(v != null){
v.parent = u.parent;
}
}
public void delete(E e){
TreeNode<E> current = search(e);
delete(current);
}
public void delete(TreeNode<E> z){
if(z.left == null){
transplant(z, z.right);
}else if(z.right == null){
transplant(z, z.left);
}else{ // z的两个孩子都有, 那就找到z的后继者
TreeNode<E> y = min(z.right);
if(y.parent != z){
transplant(y, y.right); // 为什么第二个参数是y.right,因为y就处在z.right的最左边
y.right = z.right;
y.right.parent = y;
}
transplant(z, y);
y.left = z.left;
y.left.parent = y;
}
}
public void inorder(){
inorder(root);
}
public void inorder(TreeNode<E> root){
if(root != null){
inorder(root.left);
System.out.print(root.element + " ");
inorderList.add(root.element);
inorder(root.right);
}
}
public void preorder(){
preorder(root);
}
public void preorder(TreeNode<E> root){
if(root != null){
System.out.print(root.element + " ");
preorderList.add(root.element);
preorder(root.left);
preorder(root.right);
}
}
public void postorder(){
postorder(root);
}
public void postorder(TreeNode<E> root){
if(root != null){
postorder(root.left);
postorder(root.right);
System.out.print(root.element + " ");
postorderList.add(root.element);
}
}
}
package 二叉树;
public class TreeNode <E extends Comparable<E>>{
E element;
TreeNode<E> left;
TreeNode<E> right;
TreeNode<E> parent;
public TreeNode(E e){
element = e;
}
}
package 二叉树;
public class TestBinaryTree {
public static void main(String[] args) {
// TODO 自动生成方法存根
BinaryTree<String> tree = new BinaryTree<String>();
tree.insert(new TreeNode<String>("George"));
tree.insert(new TreeNode<String>("Michael"));
tree.insert(new TreeNode<String>("Tom"));
tree.insert(new TreeNode<String>("Adam"));
tree.insert(new TreeNode<String>("Jones"));
tree.insert(new TreeNode<String>("Peter"));
tree.insert(new TreeNode<String>("Daniel"));
// Traverse tree
System.out.print("Inorder (sorted): ");
tree.inorder();
System.out.print("\nPostorder: ");
tree.postorder();
System.out.print("\nPreorder: ");
tree.preorder();
tree.delete("Jones");
System.out.print("\nAfter delete Jones: ");
System.out.print("\nInorder (sorted): ");
tree.inorder();
System.out.print("\nPostorder: ");
tree.postorder();
System.out.print("\nPreorder: ");
tree.preorder();
Integer[] numbers = {10, 5, 1, 7, 17, 13, 20};
BinaryTree<Integer> intTree = new BinaryTree<Integer>(numbers);
System.out.print("\nInorder (sorted): ");
intTree.inorder();
intTree.delete(7);
intTree.delete(1);
System.out.print("\nAfter delete 7, 1: ");
System.out.print("\nInorder (sorted): ");
intTree.inorder();
}
}
运行结果:
Inorder (sorted): Adam Daniel George Jones Michael Peter Tom
Postorder: Daniel Adam Jones Peter Tom Michael George
Preorder: George Adam Daniel Michael Jones Tom Peter
After delete Jones:
Inorder (sorted): Adam Daniel George Michael Peter Tom
Postorder: Daniel Adam Peter Tom Michael George
Preorder: George Adam Daniel Michael Tom Peter
Inorder (sorted): 1 5 7 10 13 17 20
After delete 7, 1:
Inorder (sorted): 5 10 13 17 20