数据结构 -二分搜索树 -BinarySearchTree

栏目: 数据库 · 发布时间: 5年前

内容简介:定义:任意左节点 < root;任意右节点 > root以上的代码出现的问题:e和node.e进行了两轮比较以及终止条件太臃肿先根节点,然后左节点,然后右节点

定义:任意左节点 < root;任意右节点 > root

public class Node {
    public E e;
    public Node left;
    public Node right;

    public Node(E e){
        this.e = e;
        left = null;
        right = null;
    }
}
复制代码

二、添加新元素 -递归

// 向以node为根的二分搜索树中插入元素e,递归算法
private void add(Node node, E e){
    if(e.equals(node.e))
        return;
    else if(e.compareTo(node.e) < 0 && node.left == null){
        node.left = new Node(e);
        size ++;
        return;
    }
    else if(e.compareTo(node.e) > 0 && node.right == null){
        node.right = new Node(e);
        size ++;
        return;
    }

    if(e.compareTo(node.e) < 0)
        add(node.left, e);
    else //e.compareTo(node.e) > 0
        add(node.right, e);
}

复制代码

三、改进

以上的代码出现的问题:e和node.e进行了两轮比较以及终止条件太臃肿

// 向以node为根的二分搜索树中插入元素e,递归算法
// 返回插入新节点后二分搜索树的根
private Node add(Node node, E e){
    if(node == null){
        size ++;
        return new Node(e);
    }

    if(e.compareTo(node.e) < 0)
        node.left = add(node.left, e);
    else if(e.compareTo(node.e) > 0)
        node.right = add(node.right, e);

    return node;
}

复制代码

四、二分搜索树的遍历

前序遍历

先根节点,然后左节点,然后右节点

private void preOrder(Node node){
    if(node == null)
        return;

    System.out.println(node.e);
    preOrder(node.left);
    preOrder(node.right);
}

复制代码

中序遍历

  1. 先左节点,然后根节点,然后右节点
  1. 二分搜索树的中序遍历是顺序的
private void preOrder(Node node){
    if(node == null)
        return;
    preOrder(node.left);
    System.out.println(node.e);
    preOrder(node.right);
}

复制代码

后续遍历

先左节点,然后右节点,然后根节点

private void preOrder(Node node){
    if(node == null)
        return;
    preOrder(node.left);
    preOrder(node.right);
    System.out.println(node.e);
}

复制代码

五、删除任意节点

  1. 要删除的节点d ->右子树中最小值s,也就是 s = minimum(node.right)
  2. s 的 d 的后继 ->要删除这个最小节点 s.right = removeMin(d.right) 也就是s和d 互换位置
  3. s.left = d.left -> 补充s的left
// 返回以node为根的二分搜索树的最小值所在的节点
    private Node minimum(Node node){
        if(node.left == null)
            return node;
        return minimum(node.left);
    }
复制代码
// 删除掉以node为根的二分搜索树中值为e的节点, 递归算法
    // 返回删除节点后新的二分搜索树的根
    private Node remove(Node node, E e){

        if( node == null )
            return null;

        if( e.compareTo(node.e) < 0 ){
            node.left = remove(node.left , e);
            return node;
        }
        else if(e.compareTo(node.e) > 0 ){
            node.right = remove(node.right, e);
            return node;
        }
        else{   // e.compareTo(node.e) == 0

            // 待删除节点左子树为空的情况
            if(node.left == null){
                Node rightNode = node.right;
                node.right = null;
                size --;
                return rightNode;
            }

            // 待删除节点右子树为空的情况
            if(node.right == null){
                Node leftNode = node.left;
                node.left = null;
                size --;
                return leftNode;
            }

            // 待删除节点左右子树均不为空的情况

            // 找到比待删除节点大的最小节点, 即待删除节点右子树的最小节点
            // 用这个节点顶替待删除节点的位置
            Node successor = minimum(node.right);
            successor.right = removeMin(node.right);
            successor.left = node.left;

            node.left = node.right = null;

            return successor;
        }
    }
复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

离散数学及其应用(英文版·第5版)

离散数学及其应用(英文版·第5版)

Kenneth H.Rosen / 机械工业出版社 / 2003 / 79.00元

本书第4版是全球500多所大学的指之一教材,获得了极大的成功。中文版也已被国内大学广泛有用为教材。第5版在前四版的基础上做了大量的改进,使其成为更有效的教学工具。   本书可作为1至2个学期的离散数学课入门教材,适用于数学、计算机科学、工程等专业的学生。一起来看看 《离散数学及其应用(英文版·第5版)》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具