基本性質:首先是一棵二叉樹,其次每個節點的值大於其左子樹上節點的值,小於其右子樹上節點的值。
結構:
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));
}
}