二叉排序树
对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。如果有相同的值,可以将该节点放在左子节点或右子节点。
二叉排序树的创建和遍历
思路:比较节点的值,小于就放在左子节点,大于就放在右子节点,如果子节点不为空,就递归添加。
//添加节点
public void add(Node node){
if(node==null){
return;
}
if(node.value<this.value){
if(this.left==null){
this.left=node;
}else{
this.left.add(node);
}
}else {
if(this.right==null){
this.right=node;
}else {
this.right.add(node);
}
}
}
//中序遍历
public void midOrder(){
if(this.left!=null){
this.left.midOrder();
}
System.out.println(this);
if(this.right!=null){
this.right.midOrder();
}
}
二叉排序树删除节点
思路:首先要保证能根据值找到那个要删除的节点和它的父节点。
分为5种情况:
- 要删除的值不存在,也就是目标节点为null,直接返回。
- 只有一个根节点的情况,直接root=null。
- 要删除的是叶子节点。需判断目标节点是父节点的左子节点还是右子节点,通过parent.left=null或parent.right=null删除。
- 删除有一颗子树的节点。首先判断父节点是否为空,如果为空,情况就是删除有一棵子树的根节点,直接让root=target.left或.right。如果父节点不为空,就要判断目标节点是父节点的左右子节点和目标节点的子树是左右子树,一共对应4种可能性。
- 删除有两棵子树的节点。寻找右子树的最小值或左子树的最大值,将该值赋给目标节点,并将那个最小值或最大值节点删除。
package binarySortTree;
/**
* 二叉排序树
*/
public class BinarySortTreeDemo {
public static void main(String[] args) {
int[] num={
7, 3};
BinarySortTree binarySortTree = new BinarySortTree();
for(int i:num){
binarySortTree.add(new Node(i)