`
dieslrae
  • 浏览: 35380 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

二叉树:二叉搜索树

    博客分类:
  • Tree
 
阅读更多
    所谓二叉树,就是一个节点最多只能有两个子节点,而二叉搜索树就是一个经典并简单的二叉树.规则是一个节点的左子节点一定比自己小,右子节点一定大于等于自己(当然也可以反过来).在树基本平衡的时候插入,搜索和删除速度都很快,时间复杂度为O(logN).但是,如果插入的是有序的数据,那效率就会变成O(N),在这个时候,树其实变成了一个链表.

tree代码:
public class Tree {
    private Node root;
    
    /**
     * 插入节点
     * @param data 
     */
    public void insert(int data){
        Node node = new Node(data);
        
        if(this.root == null){
            this.setRoot(node);
            return;
        }
        
        Node current = this.root;
        
        while(true){
            if(current.getData() > data){
                if(current.hasLeft()){
                    current = current.getLeft();
                }else{
                    current.setLeft(node);
                    return;
                }
            }else if(current.getData() < data){
                if(current.hasRight()){
                    current = current.getRight();
                }else{
                    current.setRight(node);
                    return;
                }
            }else{
                return;
            }
        }
    }
    
    /**
     * 删除节点
     * @param key 
     */
    public void remove(int key){
        Node node = this.findNode(key);
        
        if(node == null){
            return;
        }
        
        Node parent = node.getParent();
        
        //要删除的节点没有子节点
        if(!node.hasLeft() && !node.hasRight()){
            if(parent == null){
                this.setRoot(null);
            }else if(node.isLeft()){
                parent.setLeft(null);
            }else{
                parent.setRight(null);
            }
        //要删除的节点只有一个子节点
        }else if(!node.hasRight() || !node.hasLeft()){
            Node child = node.hasLeft() ? node.getLeft() : node.getRight();
            
            if(parent == null){
                this.setRoot(child);
            }else if(node.isLeft()){
                parent.setLeft(child);
            }else{
                parent.setRight(child);
            }
        //要删除的节点有两个子节点
        }else{
            Node successor = this.getSuccessor(node);
            
            if (parent == null) {
                this.setRoot(successor);
            } else if (node.isLeft()) {
                parent.setLeft(successor);
            } else {
                parent.setRight(successor);
            } 
        }
    }
    
    /**
     * 查找
     * @param key 
     */
    public void find(int key){
        Node node = this.findNode(key);
        
        if(node != null){
            System.out.println("node data is : " + node.getData());
        }
    }
    
    /**
     * 查找节点
     * @param key
     * @return 
     */
    private Node findNode(int key){
        Node current = this.root;
        
        while(current.getData() != key){
            if(current.getData() > key){
                if(current.hasLeft()){
                    current = current.getLeft();
                }else{
                    return null;
                }
            }else if(current.getData() < key){
                if(current.hasRight()){
                    current = current.getRight();
                }else{
                    return null;
                }
            }
        }
        
        return current;
    }
    
    /**
     * 找到继任节点,找出删除节点中右树最小的节点,如果删除节点的右节点
     * 没有子节点,则返回null
     * @param node
     * @return 
     */
    private Node getSuccessor(Node node){
        Node current = node.getRight();
        
        while(current.hasLeft()){
            current = current.getLeft();
        }
        
        if(node.getRight() != current){
            Node parent = current.getParent();
            
            if(current.hasRight()){
                parent.setLeft(current.getRight());
            }else{
                parent.setLeft(null);
            }
            
            current.setRight(node.getRight());
        }
        
        current.setLeft(node.getLeft());
        
        return current;
    }
    
    private void setRoot(Node node){
        this.root = node;
        
        if(node != null){
            node.setParent(null);
        }
    }
}


node代码:
public class Node {
    private int data;
    private Node left;
    private Node right;
    private Node parent;

    public Node(int data){
        this.data = data;
    }
    
    public int getData() {
        return data;
    }

    public void setData(int data) {
        this.data = data;
    }

    public Node getLeft() {
        return left;
    }

    public void setLeft(Node left) {
        this.left = left;
        
        if(this.left != null){
            this.left.parent = this;
        }
    }

    public Node getParent() {
        return parent;
    }

    public void setParent(Node parent) {
        this.parent = parent;
    }

    public Node getRight() {
        return right;
    }

    public void setRight(Node right) {
        this.right = right;
        
        if(this.right != null){
            this.right.parent = this;
        }
    }
    
    public boolean hasRight(){
        return this.right != null;
    }
    
    public boolean hasLeft(){
        return this.left != null;
    }
    
    public boolean isRoot(){
        return this.parent == null;
    }
    
    public boolean isRight(){
        return this.parent.right == this;
    }
    
    public boolean isLeft(){
        return this.parent.left == this;
    }
}
分享到:
评论

相关推荐

    二叉树的应用:二叉排序树BST和平衡二叉树AVL的构造 课设作业 完整代码

    二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree)。其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树:1.若它的左子树非空,则左子树上所有结点的值均小于根结点的值;2.若它的右...

    二叉树的二叉搜索表示.rar_二叉搜索树_二叉树的二叉搜索

    遍历二叉搜索树:** 由于二叉搜索树的有序性,我们可以很容易地进行前序、中序和后序遍历。 - 前序遍历:根 -&gt; 左 -&gt; 右 - 中序遍历:左 -&gt; 根 -&gt; 右 - 后序遍历:左 -&gt; 右 -&gt; 根 遍历算法通常使用递归来实现。 ...

    数据结构案例:二叉搜索树(Binary Search Tree, BST).docx

    ### 数据结构案例:二叉搜索树(Binary Search Tree, BST) #### 一、二叉搜索树(BST)定义 二叉搜索树(Binary Search Tree, BST)是一种非常重要的数据结构,其核心特性在于能够快速地进行查找、插入以及删除操作...

    算法面试通关40讲完整课件 18-20 树、二叉树、二叉搜索树

    在算法面试中,树、二叉树以及二叉搜索树是非常关键的数据结构,它们在解决各种问题时展现出高效和灵活性。下面将详细讲解这些概念及其重要性质。 **1. 树 (Tree)** 树是一种非线性的数据结构,由一个或多个节点...

    Java经典算法教程:二叉搜索树插入操作

    二叉搜索树是一种特殊的二叉树,其中每个节点的左子树只包含比该节点值小的元素,而右子树包含的元素都大于该节点值。这样的特性使得BST非常适合进行查找、插入和删除等操作,因为它们的时间复杂度可以达到O(log n)...

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

    二叉搜索树是一种二叉树,其中每个节点包含一个键(key)、一个关联值、一个指向左子树的引用和一个指向右子树的引用。二叉搜索树的性质规定,对于任意节点,其左子树中的所有节点的键都小于该节点的键,而右子树中...

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

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

    二叉排序树C++实现

    二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或二叉搜索树,是一种特殊的二叉树数据结构,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的引用和一个指向右子树的引用。在二叉排序树中...

    二叉树三种遍历,先序和中序建立二叉树,后序和中序建立二叉树,二叉搜索树查找,删除,插入

    大连理工大学数据结构上机 二叉树三种遍历,先序和中序建立二叉树,后序和中序建立二叉树,二叉搜索树查找,删除,插入

    Java实现二叉排序树

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

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

    1. 平衡二叉搜索树:普通的二叉搜索树在最坏情况下(例如键按顺序插入)退化为链表,导致查找效率降低。为了提高性能,可以使用AVL树或红黑树等自平衡二叉搜索树,它们在每次插入或删除后自动调整,保持树的高度尽...

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

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

    二叉树二叉搜索树讲义

    二叉搜索树(Binary Search Tree,BST)是二叉树的一种特殊形式,它满足以下性质: 1. 对于任意节点,其左子树中的所有节点的值都小于该节点的值。 2. 对于任意节点,其右子树中的所有节点的值都大于该节点的值。 3...

    数据结构 二叉搜索树

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

    《数据结构课程设计》二叉排序树基本操作实验程序

    接着,判断一棵二叉树是否为二叉排序树,可以通过递归检查每个节点是否满足上述二叉排序树的性质。对于每个节点,我们需要确保它的左子树中的所有节点的值都小于它,右子树中的所有节点的值都大于它,并且它的左右...

    常见的二叉树面试题大汇总(涵盖二叉搜索树)

    1. 判断是否为二叉搜索树:通过递归或迭代遍历所有节点,验证每个节点的值是否满足二叉搜索树的条件。 2. 二叉树的深度:通过递归计算从根节点到叶子节点的最大路径长度。 3. 平衡二叉树:如AVL树和红黑树,保证树...

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

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

    二叉排序树与平衡二叉树的实现

    二叉平衡树:若不是空树,则(1)左右子树都是平衡二叉树;(2)左右子树的深度之差的绝对值不超过1。 本次实验是利用二叉排序树和平衡二叉树达到以下目的:(1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉...

    最优二叉搜索树

    二叉搜索树(BST)是一种特殊的二叉树,其中每个节点都包含一个键值,且满足以下条件: 1. 左子树中所有节点的键值都小于当前节点的键值。 2. 右子树中所有节点的键值都大于当前节点的键值。 最优二叉搜索树的概念...

    数据结构第六章课件及建立二叉树的二叉链表存储结构汇总

    "第六章.ppt" 文件可能包含了关于二叉树的深入理论、示例和练习,可能涵盖了二叉树的性质、查找算法、排序算法(如二叉搜索树)以及与二叉链表相关的复杂操作。例如,可能讲解了如何判断一棵二叉树是否平衡,或者...

Global site tag (gtag.js) - Google Analytics