Java实现二叉搜索树
2014-11-22 21:06
323 查看
这几天在看算法导论,昨晚上弄明白了二叉搜索树的一些操作和数据的组织结构。把伪代码转成Java来实现。
class Node {
Node leftChild;
Node rightChild;
Node parent;
int key;
public Node(int key) {
this.key = key;
}
}
class BinarySearchTree {
Node T = null;//树根
public void TREE_INSERT(Node z) {
Node y = null;
Node x = T;
while (x != null) {
y = x;//y总指向x的父节点
if (z.key < x.key)
x = x.leftChild;
else
x = x.rightChild;
}
z.parent = y;
if (y == null)//一开始是个空树
T = z;
else if (z.key < y.key)
y.leftChild = z;
else
y.rightChild = z;
}
public Node TREE_SEARCH(Node x, int k) {
if (x == null || k == x.key)
return x;
if (k < x.key)
return TREE_SEARCH(x.leftChild, k);
else
return TREE_SEARCH(x.rightChild, k);
}
public Node TREE_MINIMUM(Node x) {
while (x.leftChild != null)
x = x.leftChild;
return x;
}
public Node TREE_MAXIMUM(Node x) {
while (x.rightChild != null)
x = x.rightChild;
return x;
}
public Node TREE_SUCCESSOR(Node x) {
if (x.rightChild != null)
return TREE_MINIMUM(x.rightChild);
Node y = x.parent;
while (y != null && x == y.rightChild) {
x = y;
y = y.parent;
}
return y;
}
public Node TREE_DELETE(Node z) {
Node x, y;
if (z.leftChild == null || z.rightChild == null)
y = z;
else//左右子树的都有
y = TREE_SUCCESSOR(z);//求z的后继
if (y.leftChild != null)
x = y.leftChild;
else
x = y.rightChild;
if (x != null)
x.parent = y.parent;//z有两个子女的情况,x是y的左子树或右子树,y要么是z要么是z的后继
if (y.parent == null)
T = x;
else if (y == y.parent.leftChild)
y.parent.leftChild = x;
else
y.parent.rightChild = x;
if (y != z)
z.key = y.key;
return y;
}
public void TREE_SEARCH_SHOW(Node x) {
if (x == null)
return;
TREE_SEARCH_SHOW(x.leftChild);
System.out.print(x.key + " ");
TREE_SEARCH_SHOW(x.rightChild);
}
}
public class Main {
public static void main(String[] args) {
BinarySearchTree tree = new BinarySearchTree();
tree.TREE_INSERT(new Node(2));
tree.TREE_INSERT(new Node(3));
tree.TREE_INSERT(new Node(4));
Node node6 = new Node(6);
tree.TREE_INSERT(node6);
tree.TREE_INSERT(new Node(7));
tree.TREE_INSERT(new Node(9));
Node node13 = new Node(13);
tree.TREE_INSERT(node13);
tree.TREE_INSERT(new Node(15));
tree.TREE_INSERT(new Node(17));
tree.TREE_INSERT(new Node(18));
tree.TREE_INSERT(new Node(20));
System.out.println(tree.TREE_SUCCESSOR(node6).key);
System.out.println(tree.TREE_DELETE(node6).key);
tree.TREE_SEARCH_SHOW(tree.T);
}
}
class Node {
Node leftChild;
Node rightChild;
Node parent;
int key;
public Node(int key) {
this.key = key;
}
}
class BinarySearchTree {
Node T = null;//树根
public void TREE_INSERT(Node z) {
Node y = null;
Node x = T;
while (x != null) {
y = x;//y总指向x的父节点
if (z.key < x.key)
x = x.leftChild;
else
x = x.rightChild;
}
z.parent = y;
if (y == null)//一开始是个空树
T = z;
else if (z.key < y.key)
y.leftChild = z;
else
y.rightChild = z;
}
public Node TREE_SEARCH(Node x, int k) {
if (x == null || k == x.key)
return x;
if (k < x.key)
return TREE_SEARCH(x.leftChild, k);
else
return TREE_SEARCH(x.rightChild, k);
}
public Node TREE_MINIMUM(Node x) {
while (x.leftChild != null)
x = x.leftChild;
return x;
}
public Node TREE_MAXIMUM(Node x) {
while (x.rightChild != null)
x = x.rightChild;
return x;
}
public Node TREE_SUCCESSOR(Node x) {
if (x.rightChild != null)
return TREE_MINIMUM(x.rightChild);
Node y = x.parent;
while (y != null && x == y.rightChild) {
x = y;
y = y.parent;
}
return y;
}
public Node TREE_DELETE(Node z) {
Node x, y;
if (z.leftChild == null || z.rightChild == null)
y = z;
else//左右子树的都有
y = TREE_SUCCESSOR(z);//求z的后继
if (y.leftChild != null)
x = y.leftChild;
else
x = y.rightChild;
if (x != null)
x.parent = y.parent;//z有两个子女的情况,x是y的左子树或右子树,y要么是z要么是z的后继
if (y.parent == null)
T = x;
else if (y == y.parent.leftChild)
y.parent.leftChild = x;
else
y.parent.rightChild = x;
if (y != z)
z.key = y.key;
return y;
}
public void TREE_SEARCH_SHOW(Node x) {
if (x == null)
return;
TREE_SEARCH_SHOW(x.leftChild);
System.out.print(x.key + " ");
TREE_SEARCH_SHOW(x.rightChild);
}
}
public class Main {
public static void main(String[] args) {
BinarySearchTree tree = new BinarySearchTree();
tree.TREE_INSERT(new Node(2));
tree.TREE_INSERT(new Node(3));
tree.TREE_INSERT(new Node(4));
Node node6 = new Node(6);
tree.TREE_INSERT(node6);
tree.TREE_INSERT(new Node(7));
tree.TREE_INSERT(new Node(9));
Node node13 = new Node(13);
tree.TREE_INSERT(node13);
tree.TREE_INSERT(new Node(15));
tree.TREE_INSERT(new Node(17));
tree.TREE_INSERT(new Node(18));
tree.TREE_INSERT(new Node(20));
System.out.println(tree.TREE_SUCCESSOR(node6).key);
System.out.println(tree.TREE_DELETE(node6).key);
tree.TREE_SEARCH_SHOW(tree.T);
}
}
相关文章推荐
- Java 二叉搜索树的链表实现
- Java二叉搜索树实现
- 二叉搜索树节点删除 java实现
- 二叉搜索树的基本java实现
- Java实现二叉搜索树
- java实现二叉搜索树
- 剑指offer----二叉搜索树的后序遍历----java实现
- Java实现二叉搜索树及相关操作
- 剑指offer刷题之java实现的二叉搜索树的后序遍历序列
- java :非递归方法的二叉搜索树,实现部分功能
- Java二叉搜索树(Binary Search Tree)实现
- 【算法与数据结构】二叉搜索树的Java实现
- Java 实现二叉搜索树的创建、查找、插入、删除结点
- BST(二叉搜索树) Java 实现解析
- Java实现二叉搜索树节点的删除
- 二叉搜索树之Java实现
- Java实现二叉搜索树
- 剑指offer--面试题24:二叉搜索树的后序遍历序列--Java实现
- Java创建二叉搜索树,实现搜索,插入,删除操作
- 剑指Offer:面试题24——二叉搜索树的后序遍历序列(java实现)