`
shenyu
  • 浏览: 122986 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Tree 二叉搜索树

阅读更多

每个节点最多两个子节点,其中左边节点的值小于该节点的值,右边节点的值大于该节点的值。为了简便起见,该二叉树装入的数据为整数,且不允许有重复的关键字值。

编程中为了简便,采用了递归算法,运算时会带来额外的开销,如果能将相应的算法替换为迭代,则更为有效。删除的算法相应复杂一些,但也可以承受。


API
add:将数加入树
remove:从树中删除指定的节点
contains:树中是否包含指定的数
ordinal:从小到大遍历打印数(测试只用)
max:查找最大值
min:查找最小值
其中Node类是辅助类,为了简单没有写标准的 get,set方法。

因为该树没有自我保持平衡的能力,因此对于随机插入的数据,效果较好,对于有局部生降序特征的插入序列,则会失去平衡,极端状况下,树退化成链表。关于平衡树请参见(Tree2-3-4红黑树 ,Tree-2-3 )
Tree的main函数仅为测试之用。

class Node {

    private int value;

    private Node left;

    private Node right;



    Node(int value) {

        this.value = value;

    }



    int value() {

        return value;

    }



    void left(Node left) {

        this.left = left;

    }



    void right(Node right) {

        this.right = right;

    }



    Node left() {

        return left;

    }



    Node right() {

        return right;

    }

}



class Tree {

    private Node root;

   

    void add(int value) {

        Node node = new Node(value);   

        if(root == null) root = node;

        else add(root,node);

    }



    private void add(Node current, Node node) {

        if(node.value() < current.value()) {

            if(current.left() == null) current.left(node);

            else add(current.left(), node);

        } else if(node.value() > current.value()) {

            if(current.right() == null) current.right(node);

            else add(current.right(), node);

        }

    }



    boolean contains(int value) {

        if(root == null) return false;

        else return contains(root,value);

    }



    private boolean contains(Node current, int value) {

        if(current == null) return false;

        if(current.value() == value) return true;

        if(value < current.value()) return contains(current.left(),value);

        else return contains(current.right(),value);

    }



    void remove(int value) {

        remove(null,root,value);

    }



    private void remove(Node parent, Node current, int value) {

        if(current == null) return;

        if(current.value() == value) {

            Node node;

            if(current.left() == null && current.right() ==  null) node = null;

            else if (current.left() != null && current.right() == null) node = current.left();

            else if (current.right() != null && current.left() == null) node = current.right();

            else {

                node = removeMin(current,current.right());

                node.left(current.left());

                node.right(current.right());

            }

            if(parent == null) root = node;

            else if(parent.left() == current) parent.left(node);

            else parent.right(node);

        } else if(value < current.value()) remove(current,current.left(),value);

        else remove(current,current.right(),value);

    }



    private Node removeMin(Node parent, Node current) {

        if(current.left() != null) return removeMin(current,current.left());

        else {

            if(parent.left() == current) parent.left(current.right());

            else parent.right(current.right());

            return current;

        }

    }



    int max() {

        if(root == null) return -1;

        else return max(root);

    }



    private int max(Node current) {

        if(current.right() == null) return current.value();

        else return max(current.right());

    }



    int min() {

        if(root == null) return -1;

        else return min(root);

    }



    private int min(Node current) {

        if(current.left() == null) return current.value();

        else return min(current.left());

    }



    void ordinal() {

        if (root == null) return;

        else ordinal(root);

    }



    void ordinal(Node current) {

        if(current.left() != null) ordinal(current.left());

        System.out.println(current.value() + " ");

        if(current.right() != null) ordinal(current.right());

    }



    public static void main(String[] args) {

        Tree t = new Tree();

        t.add(50);

        t.add(6);

        t.add(29);

        t.add(100);

        t.add(34);

        t.add(45);

        t.add(4);

        t.add(68);

       

        t.ordinal();

        System.out.println(t.contains(34));

        assert t.contains(34);

        assert t.contains(6);

        assert !t.contains(110);

        assert t.max() == 100;

        assert t.min() == 4;

       

        t.remove(50);

        t.remove(45);

        t.remove(6);

        t.ordinal();

    }

}

 

分享到:
评论

相关推荐

    binary search tree 二叉搜索树的C++实现,有插入、删除、查找、查找最大最小等功能

    binary search tree 二叉搜索树的C++实现,有插入、删除、查找、查找最大最小等功能,并附有测试例子,简单易懂

    操作二叉搜索树(插入节点、遍历)

    二叉搜索树(Binary Search Tree,BST)是一种特殊的二叉树结构,它的每个节点都具有以下特性:左子树上所有节点的值均小于当前节点的值,右子树上所有节点的值均大于当前节点的值。这种特性使得二叉搜索树在查找、...

    基于二叉搜索树实现的电话簿程序

    在计算机科学中,数据结构是存储和组织数据的关键方式,而二叉搜索树(Binary Search Tree,BST)作为一种特殊的数据结构,因其高效的操作性能在各种实际应用中得到广泛使用。本程序正是利用了二叉搜索树的特性,...

    C++二叉搜索树的插入和删除例子

    二叉搜索树(Binary Search Tree,BST)是一种特殊类型的二叉树,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的指针和一个指向右子树的指针。在二叉搜索树中,对于任何一个节点,其左子树中的...

    二叉搜索树算法(共两个PPT)

    二叉搜索树(Binary Search Tree,BST),是数据结构领域中的一个重要概念,它是一种特殊的二叉树,每个节点的左子树只包含比其小的元素,而右子树则包含大于它的元素。这种特性使得二叉搜索树在查找、插入和删除...

    二叉搜索树(Binary Search Tree,BST)的实现与操作.docx

    二叉搜索树(Binary Search Tree,BST)的实现与操作.docx 二叉搜索树(Binary Search Tree,BST)的实现与操作.docx 二叉搜索树(Binary Search Tree,BST)的实现与操作.docx 二叉搜索树(Binary Search Tree,BST...

    acm二叉搜索树参考代码

    二叉搜索树(Binary Search Tree,BST)是一种特殊的二叉树结构,它的每个节点都包含一个键值(key)、一个关联的数据值、一个指向左子树的指针和一个指向右子树的指针。在二叉搜索树中,对于任意节点而言,其左子树...

    霍夫曼树和二叉搜索树代码实现

    从给定的文件信息来看,该段代码主要涉及到了数据结构中的两个重要概念:霍夫曼树(Huffman Tree)和二叉搜索树(Binary Search Tree),并使用C++语言进行实现。以下是对这两个知识点的详细解析: ### 霍夫曼树...

    tree-java.rar_tree_二叉搜索树

    二叉搜索树(Binary Search Tree, BST)是一种特殊的二叉树数据结构,它具有以下特性: 1. **每个节点都包含一个键(key)、一个关联的值、一个指向左子节点的引用和一个指向右子节点的引用**。 2. **键的值大于左...

    二叉搜索树_二叉搜索树_源码

    二叉搜索树(Binary Search Tree, BST)是一种特殊的二叉树结构,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的指针和一个指向右子树的指针。在二叉搜索树中,对于任何节点,其左子树中的所有...

    增强二叉搜索树

    增强二叉搜索树,也称为动态二叉搜索树或自平衡二叉搜索树,是一种在普通二叉搜索树基础上增加了额外特性的数据结构。在普通的二叉搜索树中,每个节点包含一个键值(key)以及指向左子树和右子树的指针,同时还保证...

    二叉搜索树的源码,加上注释和自己理解

    二叉搜索树(Binary Search Tree,BST)是一种特殊的二叉树结构,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的引用和一个指向右子树的引用。在二叉搜索树中,对于任意节点,其左子树中的所有...

    最优二叉搜索树模范讲解

    **最优二叉搜索树**(Optimal Binary Search Tree,简称OBST)是一种特殊的二叉搜索树,其节点按照特定的方式排列,使得在进行搜索操作时所需的平均成本最小。在实际应用中,构建一个最优的二叉搜索树能够有效提高数据...

    数据结构 二叉搜索树

    二叉搜索树(Binary Search Tree,BST)是数据结构中的一种特殊类型,它是一种二叉树,具有以下特性: 1. 每个节点都包含一个键(key)、一个关联的值、一个指向左子节点的引用和一个指向右子节点的引用。 2. 节点...

    二叉搜索树的C++源代码

    二叉搜索树(Binary Search Tree, BST)是一种特殊类型的二叉树,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的指针和一个指向右子树的指针。在二叉搜索树中,对于任何一个节点,其左子树中的...

    BST.rar_binary search tree_二叉搜索树

    二叉搜索树(Binary Search Tree,BST)是一种特殊类型的二叉树,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的引用和一个指向右子树的引用。在二叉搜索树中,对于任意节点,其左子树中的所有...

    二叉搜索树vc6.0运行ok代码

    二叉搜索树(Binary Search Tree,BST)是一种特殊的二叉树数据结构,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的引用和一个指向右子树的引用。在二叉搜索树中,对于任意节点,其左子树中的...

    面试题27_二叉搜索树与双向链表

    在IT领域,二叉搜索树(Binary Search Tree, BST)是一种常见的数据结构,它具有左子树上所有节点的值小于根节点的值,右子树上所有节点的值大于根节点的值的特性。这样的特性使得二叉搜索树非常适合进行查找、插入...

    二叉搜索树统计单词频率 MFC实现

    二叉搜索树(BST,Binary Search Tree)是一种特殊的二叉树结构,它的每个节点都包含一个键值(key)、一个关联的数据或值、一个指向左子树的引用和一个指向右子树的引用。在二叉搜索树中,对于任何非空节点,其左...

    VC/C++实现二叉搜索树查找算法

    二叉搜索树(Binary Search Tree, BST)是计算机科学中一种重要的数据结构,它在处理大量数据时提供了高效的操作,如查找、插入和删除。在本主题中,我们将深入探讨如何使用VC/C++编程语言实现二叉搜索树的查找算法...

Global site tag (gtag.js) - Google Analytics