好像一个多星期没写代码了,感觉手生很,脑袋不转啊。还是复习一下算法,今天早上把二叉查找树重写了一遍,而且还把节点的删除完全看明白了,
// 返回最大值的节点
public Node Maximum() {
Node temp = root;
while (temp.getRight() != null) {
temp = temp.getRight();
}
return temp;
}
// 查询包含关键字K的节点(非递归)
public Node search(int k) {
Node x = root;
while (x != null) {
if (x == null || k == x.getData()) {
return x;
} else if (k < x.getData()) {
x = x.getLeft();
} else {
x = x.getRight();
}
}
return x;
}
//查找包含关键字k的节点(递归)
public Node searchRecursive(Node node, int k) {
if (node == null || k == node.getData()) {
return node;
}
if (k < node.getData()) {
return searchRecursive(node.getLeft(), k);
} else {
return searchRecursive(node.getRight(), k);
}
}
//返回后继节点
public Node successor(int k) {
Node node = search(k);
return successor(node);
}
public Node successor(Node node) {
if (node.getRight() != null) {
return Minimum(node.getRight());
}
Node temp = node;
Node parent = node.getParent();
while (parent != null && parent.getRight() == temp) {
temp = parent;
parent = parent.getParent();
}
return parent;
}
//返回前驱节点
public Node predecessor(int k) {
Node node = search(k);
return predecessor(node);
}
public Node predecessor(Node node) {
if (node.getLeft() != null) {
return node.getLeft();
}
Node temp = node;
Node parent = node.getParent();
while (parent != null && parent.getLeft() == temp) {
temp = parent;
parent = parent.getParent();
}
return parent;
}
//删除关键字为k的节点
public Node delete(int k) {
Node node = search(k);
Node temp = null;
Node tempChild = null;
if (node.getLeft() == null || node.getRight() == null) {
temp = node;
} else {
temp = successor(node);
}
if (temp.getLeft() != null) {
tempChild = temp.getLeft();
} else {
tempChild = temp.getRight();
}
if (tempChild != null) {
tempChild.setParent(temp.getParent());
}
if (temp.getParent() == null) {
root = tempChild;
} else if (temp.getParent().getRight() == temp) {
temp.getParent().setRight(tempChild);
} else if (temp.getParent().getLeft() == temp) {
temp.getParent().setLeft(tempChild);
}
if (temp != node) {
node.setData(temp.getData());
}
return temp;
}
//中序遍历
public void printTree() {
printTree(root);
System.out.println(" ");
}
public void printTree(Node node) {
if (node != null) {
printTree(node.getLeft());
System.out.print(node.getData() + " ");
printTree(node.getRight());
}
}
}
class Node {
private Node left;
private Node right;
private Node parent;
private int data;
public Node() {
}
public Node(int data) {
this(data, null, null, null);
}
private Node(int data, Node parent, Node left, Node right) {
this.data = data;
this.left = left;
this.parent = parent;
this.right = right;
}
public Node getLeft() {
return left;
}
public void setLeft(Node left) {
this.left = left;
}
public Node getRight() {
return right;
}
public void setRight(Node right) {
this.right = right;
}
public Node getParent() {
return parent;
}
public void setParent(Node parent) {
this.parent = parent;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
}
测试代码:
算法的重点在于找节点的后继,节点的前驱,和删除。