基本性质:首先是一棵二叉树,其次每个节点的值大于其左子树上节点的值,小于其右子树上节点的值。
结构:
public class myBST {
Node root = null;
class Node {
int value;
Node left_child = null;
Node right_child = null;
Node(int value) {
this.value = value;
}
}
}
节点的插入:
public void Insert(int value) {
if (root == null) {
root = new Node(value);
return;
}
Node cur = root;
while (cur != null) {
if (value < cur.value) {
if (cur.left_child != null) {
cur = cur.left_child;
} else {
cur.left_child = new Node(value);
return;
}
} else if (value > cur.value) {
if (cur.right_child != null) {
cur = cur.right_child;
} else {
cur.right_child = new Node(value);
return;
}
}
}
}
节点的寻找:
public boolean Find(int value) {
Node cur = root;
while (cur != null) {
if (cur.value == value) {
return true;
} else if (cur.value < value) {
cur = cur.right_child;
} else {
cur = cur.left_child;
}
}
return false;
}
节点的删除,分为三种情况:
public boolean Delete(int value) {
Node parent = root;
Node cur = root;
while (cur != null) {
if (value == cur.value) {
break;
} else if (value < cur.value) {
parent = cur;
cur = cur.left_child;
} else {
parent = cur;
cur = cur.right_child;
}
}
if (cur == null) {
//没有找到
return false;
}
if (cur.left_child == null && cur.right_child == null) {
if (cur == parent) {
//是根节点
root = null;
return true;
} else {
//是叶子节点
cur = null;
return true;
}
} else if (cur.left_child != null && cur.right_child == null) {
//待删除的节点只有左节点
if (cur == parent) {
root = cur.left_child;
return true;
} else {
if (cur == parent.left_child) {
parent.left_child = cur.left_child;
return true;
} else {
parent.right_child = cur.left_child;
return true;
}
}
} else if (cur.left_child == null && cur.right_child != null) {
//待删除的节点只有右节点
if (cur == parent) {
root = cur.right_child;
return true;
} else {
if (cur == parent.left_child) {
parent.left_child = cur.right_child;
return true;
} else {
parent.right_child = cur.right_child;
return true;
}
}
} else {
//待删除的节点左节点和右节点都存在
//将左子树链接到右子树最左的节点下
Node temp = cur.right_child;
while (temp.left_child != null) {
temp = temp.left_child;
}
temp.left_child = cur.left_child;
if (parent != cur) {
if (parent.left_child == cur) {
parent.left_child = cur.right_child;
} else {
parent.right_child = cur.right_child;
}
} else {
root = cur.right_child;
}
return true;
}
}
三种遍历:
//根、左、右
public void PreOrder(Node node) {
if (node != null) {
System.out.print(node.value + " ");
PreOrder(node.left_child);
PreOrder(node.right_child);
}
}
public void PreOrder() {
PreOrder(root);
}
//左、根、右
public void inOrder(Node node) {
if (node != null) {
inOrder(node.left_child);
System.out.print(node.value + " ");
inOrder(node.right_child);
}
}
public void inOrder() {
inOrder(root);
}
public void posOrder(Node node) {
if (node != null) {
posOrder(node.left_child);
posOrder(node.right_child);
System.out.print(node.value + " ");
}
}
public void posOrder() {
posOrder(root);
}
完成的程序:
package myBST;
public class myBST {
Node root = null;
class Node {
int value;
Node left_child = null;
Node right_child = null;
Node(int value) {
this.value = value;
}
}
public void Insert(int value) {
if (root == null) {
root = new Node(value);
return;
}
Node cur = root;
while (cur != null) {
if (value < cur.value) {
if (cur.left_child != null) {
cur = cur.left_child;
} else {
cur.left_child = new Node(value);
return;
}
} else if (value > cur.value) {
if (cur.right_child != null) {
cur = cur.right_child;
} else {
cur.right_child = new Node(value);
return;
}
}
}
}
public boolean Find(int value) {
Node cur = root;
while (cur != null) {
if (cur.value == value) {
return true;
} else if (cur.value < value) {
cur = cur.right_child;
} else {
cur = cur.left_child;
}
}
return false;
}
public boolean Delete(int value) {
Node parent = root;
Node cur = root;
while (cur != null) {
if (value == cur.value) {
break;
} else if (value < cur.value) {
parent = cur;
cur = cur.left_child;
} else {
parent = cur;
cur = cur.right_child;
}
}
if (cur == null) {
//没有找到
return false;
}
if (cur.left_child == null && cur.right_child == null) {
if (cur == parent) {
//是根节点
root = null;
return true;
} else {
//是叶子节点
cur = null;
return true;
}
} else if (cur.left_child != null && cur.right_child == null) {
//待删除的节点只有左节点
if (cur == parent) {
root = cur.left_child;
return true;
} else {
if (cur == parent.left_child) {
parent.left_child = cur.left_child;
return true;
} else {
parent.right_child = cur.left_child;
return true;
}
}
} else if (cur.left_child == null && cur.right_child != null) {
//待删除的节点只有右节点
if (cur == parent) {
root = cur.right_child;
return true;
} else {
if (cur == parent.left_child) {
parent.left_child = cur.right_child;
return true;
} else {
parent.right_child = cur.right_child;
return true;
}
}
} else {
//待删除的节点左节点和右节点都存在
//将左子树链接到右子树最左的节点下
Node temp = cur.right_child;
while (temp.left_child != null) {
temp = temp.left_child;
}
temp.left_child = cur.left_child;
if (parent != cur) {
if (parent.left_child == cur) {
parent.left_child = cur.right_child;
} else {
parent.right_child = cur.right_child;
}
} else {
root = cur.right_child;
}
return true;
}
}
//根、左、右
public void PreOrder(Node node) {
if (node != null) {
System.out.print(node.value + " ");
PreOrder(node.left_child);
PreOrder(node.right_child);
}
}
public void PreOrder() {
PreOrder(root);
}
//左、根、右
public void inOrder(Node node) {
if (node != null) {
inOrder(node.left_child);
System.out.print(node.value + " ");
inOrder(node.right_child);
}
}
public void inOrder() {
inOrder(root);
}
public void posOrder(Node node) {
if (node != null) {
posOrder(node.left_child);
posOrder(node.right_child);
System.out.print(node.value + " ");
}
}
public void posOrder() {
posOrder(root);
}
public static void main(String[] args) {
int[] nums = {50, 25, 65, 15, 35, 55, 70, 10, 20, 30, 36};
myBST bst = new myBST();
for (int i = 0; i < nums.length; i++) {
bst.Insert(nums[i]);
}
bst.PreOrder();
System.out.println();
bst.Delete(50);
bst.PreOrder();
System.out.println();
// System.out.println(bst.Find(33));
}
}