开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
排序二叉树前言
在上一篇文章里,就是关于树的知识,以及树的一种典型分支二叉树,然后又完成了一种二叉树的实例——表达式树。通过表达式树我们可以知道其前缀,中缀以及后缀表达式(如果你真的去完成)。但是表达式树依旧common,所以接下来我就会介绍下排序二叉树也叫查找二叉树。
排序二叉树
对于排序二叉树来说,他首先也是一种二叉树,但是他对每个节点的值都具有约束,比如说左节点是比父节点parent要小的,右节点则是恰恰相反是比较大的。这就要求我们的结点都是能排序的,最后实现Comparable接口,重写对应的compareTo方法,当然你也可以不写,只不过局限性较大吧了。
@Override
public int compareTo(huffmanTreeNode o) {
return this.data-o.data;//代表从小到大排序,如果是从大到小就是外面括号加一个-
}
在创建的时候直接把树的root节点赋值实例化就好了。然后就是循环执行插入insert方法。
public void insert(Node node, int data) {
//先对数据进行校验
if (node == null) {
return;
}
if (node.data < data) {
if (node.rNode == null) {
Node tempNode = new Node(data);
node.rNode = tempNode;
} else {
insert(node.rNode, data);
}
}
if (node.data >= data) {
if (node.lNode == null) {
Node tempNode = new Node(data);
node.lNode = tempNode;
} else {
insert(node.lNode, data);
}
}
}
在创建后一棵排序二叉树后,你就可以找些对应的finmin和finmax还有contains,还有remove方法。remove之前的方法跟insert方法是不无二致的。但是remove的方法值得再分一节讨论。
remove方法
这里删除包括了三种情况,删除的结点1.一个子节点都没有2.具有一个子节点3.具有两个子节点(最麻烦的一种)。
没有子节点
没有子节点的,找到对应节点的父节点然后置空就好了。
一个子节点
这个就让父节点接那个要删除节点的子节点就好了。
两个节点
让左节点想上一种情况操作,然后用一个临时变量接到一个删除节点的父节点,然后接到左节点的最右边,这是一种方式,但是最后一种方式删除多了最后可能会成为链表,你也可以在节点处设置变量代表其是否删除。针对这个我们后面会采取avl处理。