版权声明: https://blog.csdn.net/King8611/article/details/83718060
写了一个简单的。
因为自己对泛型了解的还是不够到位,所以只能写个demo版的。
这课树没办法维持平衡,希望以后学一下红黑树,替罪羊树etc.
/*
* 简单的二叉查找树
* 没有自带旋转平衡
* 写完这个我学一下
* avl树还有红黑树
*/
public class SearchTree {
private Node head;
public void insert(int x) { //插入函数
Node node=new Node(x);
if(head==null) {
head=node;
return;
}
Node cur=head; //遍历节点
while(cur!=null) {
if(cur.v>x) { //如果x比较小
if(cur.left==null) {
cur.left=node;
node.parent=cur;
return;
}else {
cur=cur.left;
}
}
else {
if(cur.right==null) {
cur.right=node;
node.parent=cur;
return;
}else {
cur=cur.right;
}
}
}
}
public Node find(int x) { //查询是否包含x
Node cur=head;
while(cur!=null) {
if(cur.v==x)
return cur;
if(cur.v>x)
cur=cur.left;
else
cur=cur.right;
}
return null;
}
public void delete(int x) { //删除节点函数
Node node=find(x); //找到和这个值对应的节点
if(node==null)
return ;
if(node.left==null) {
transPlant(node,node.right);
}
else if(node.right==null) {
transPlant(node,node.left);
}
else {
Node cur=minNode(node.right); //如果双子不是null,取其前驱,其实后继也行
if(cur.parent!=node) {
transPlant(cur,cur.right); //这两步看书上写的,感觉很妙
cur.right=node.right;
cur.parent.right=cur;
}
transPlant(node,cur);
cur.left=node.left;
cur.left.parent=cur;
}
}
private void transPlant(Node u,Node v) { //交换节点,为删除方法提供
if(u.parent==null) //如果这个点是根节点
this.head=v; //呃,这都很好理解吧
else if(u==u.parent.left)
u.parent.left=v;
else
u.parent.right=v;
if(v!=null)
v.parent=u.parent;
}
public Node maxNode() { //查询最大节点
return maxNode(head);
}
private Node maxNode(Node node) {
if(node==null)return null;
return node.right==null?node:maxNode(node.right);
}
public Node minNode() { //查询最大节点
return minNode(head);
}
private Node minNode(Node node) {
return node.left==null?node:maxNode(node.left);
}
public void print() { //打印插入后的中根遍历
dfs(head);
System.out.println();
}
private void dfs(Node node) { //中根遍历
if(node==null)
return;
dfs(node.left);
System.out.print(node+" ");
dfs(node.right);
}
private class Node{
int v;
Node left;
Node right;
Node parent;
public Node(int x) {
v=x;
}
public String toString() {
return v+"";
}
}
}