/**
* @author chenyi
* @Description 二叉排序树
* @date 2022/2/23 10:12
*/
public class BinarySortTreeDemo {
Node root;
public static void main(String[] args) {
int[] arr = {7, 3, 10, 12, 5, 1, 9, 2};
BinarySortTreeDemo treeDemo = new BinarySortTreeDemo();
for (int i : arr) {
treeDemo.add(i);
}
treeDemo.perOrder();
System.out.println("测试删除节点");
treeDemo.del(1);
treeDemo.del(2);
treeDemo.del(3);
treeDemo.del(5);
treeDemo.del(0);
treeDemo.perOrder();
}
public void add(int val) {
if (root == null) {
root = new Node(val);
return;
}
Node node = new Node(val);
Node temp = root;
Node parent;
do {
parent = temp;
temp = temp.value > val ? temp.left : temp.right;
} while (temp != null);
if (parent.value > val) {
parent.left = node;
} else {
parent.right = node;
}
}
public void del(int val) {
Node temp = this.root;
Node parent = null;
while (temp != null && temp.value!=val) {
parent = temp;
temp = temp.value > val ? temp.left : temp.right;
}
if(temp == null) {
// 没有找到val匹配的节点
return;
}
if(temp.left == null && temp.right == null) {
// 删除叶子节点
if(parent == null) {
this.root = null;
return;
}
if(parent.left == temp) {
parent.left = null;
} else {
parent.right = null;
}
} else if(temp.left != null && temp.right != null) {
// 删除有两个子树
// 找到右子树中最小的节点,用最小节点的值替换当前节点的值,删除最小的节点
Node minNode = temp.right;
Node minNodeParent = temp;
while (minNode.left!= null){
minNodeParent = minNode;
minNode = minNode.left;
}
temp.value = minNode.value;
if(minNodeParent.left == minNode) {
minNodeParent.left = null;
} else {
minNodeParent.right = null;
}
} else {
// 删除只有一个子树
if(parent.left == temp) {
parent.left = temp.left==null ? temp.right : temp.left;
} else {
parent.right = temp.left==null ? temp.right : temp.left;
}
}
}
public void perOrder() {
System.out.println();
perOrder(this.root);
System.out.println();
}
private void perOrder(Node node) {
if (node == null) {
return;
}
perOrder(node.left);
System.out.print(node.value+ " ");
perOrder(node.right);
}
class Node {
int value;
Node left;
Node right;
public Node(int value) {
this.value = value;
}
@Override
public String toString() {
return "Node{" + "value=" + value + '}';
}
}
}
二叉排序树
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 参考资料:[1]http://www.cnblogs.com/skywang12345/p/3576373.htm...
- 一.课程设计题目及要求 (一)课程设计题目 用顺序和二叉链表作存储结构实现二叉排序树: (1)以回车('\n')为...
- 一、满二叉树 除最后一层无任何子节点外,每一层上的所有结点都有两个子结点二叉树。或者说:一个二叉树,如果每一个层的...
- 可以由一个线性输入序列依照二叉查找树的规则进行构建 二叉查找树的删除比较复杂, 详见: https://songl...