美文网首页
二叉查找树的搜索、插入、删除、遍历等操作

二叉查找树的搜索、插入、删除、遍历等操作

作者: gotchar | 来源:发表于2020-05-19 23:43 被阅读0次

节点结构,每个节点保存left节点 & right节点,以及当前节点的数据

public class TreeNode {
    private int data;
    private TreeNode leftChirld;
    private TreeNode rightChirld;

    public TreeNode(int val){
        this.data = val;
    }
    public int getData() {
        return data;
    }
    public void setData(int data) {
        this.data = data;
    }
    public TreeNode getLeftChirld() {
        return leftChirld;
    }
    public void setLeftChirld(TreeNode leftChirld) {
        this.leftChirld = leftChirld;
    }
    public TreeNode getRightChirld() {
        return rightChirld;
    }
    public void setRightChirld(TreeNode rightChirld) {
        this.rightChirld = rightChirld;
    }

}

二叉树结构

public class BinaryTree {
    private TreeNode root;
    private int size;

搜索,使用递归

    public TreeNode find(int val){
        return find(root, val);
    }

/**
     * 利用递归查找节点,如果没有则为null
     * @param node
     * @param val
     * @return
     */
    private TreeNode find(TreeNode node, int val){
        TreeNode cur = node;
        if (cur == null || val == cur.getData()){
            return cur;
        }

        if (val < cur.getData()){
            return find(cur.getLeftChirld(), val);
        }else if (val > cur.getData()){
            return find(cur.getRightChirld(),val);
        }

        return null;
    }

插入操作,写的比较繁琐

public void insert(int val){
        //Add a new node when there is no node
        if (root == null){
            root = new TreeNode(val);
        }else {
            TreeNode cur = root;

            //如果val大于某个节点,并且节点的子节点不为空,遍历子节点的节点,否则新建一个节点
            while (cur != null){
                if (val < cur.getData() && cur.getLeftChirld() == null){
                    size++;
                    cur.setLeftChirld(new TreeNode(val));
                    break;
                }else if (val < cur.getData() && cur.getLeftChirld() != null){
                    cur = cur.getLeftChirld();
                }

                if (val > cur.getData() && cur.getRightChirld() == null){
                    size++;
                    cur.setRightChirld(new TreeNode(val));
                    break;
                }else if (val > cur.getData() && cur.getRightChirld() != null){
                    cur = cur.getRightChirld();
                }

                if (val == cur.getData()){
                    cur.setData(val);
                    break;
                }
            }

        }
    }

删除
考虑三种情况、要删除的节点没有子节点、要删除的节点只有左节点或者右节点、要删除的节点有两个节点

public void delete(int val){
        TreeNode cur = root;
        TreeNode prev = null;

        while (cur != null && cur.getData() != val){
            prev = cur;
            if (val < cur.getData()){
                cur = cur.getLeftChirld();
            }else{
                cur = cur.getRightChirld();
            }
        }

        if (cur == null){
            return;
        }

        //如果节点的左右节点不为空,找到右节点的最小节点,将它替换到当前要删除的节点。
        if (cur.getLeftChirld() != null && cur.getRightChirld() != null){
            //find the smallest node of right subtree
            TreeNode rightNodeParent = cur;
            TreeNode rightNode = cur.getRightChirld();
            while (rightNode.getLeftChirld() != null){
                rightNodeParent = rightNode;
                rightNode = rightNode.getLeftChirld();
            }

            if (rightNode == null){
                rightNode = rightNodeParent;
            }

            cur.setData(rightNode.getData());
            rightNodeParent.setLeftChirld(null);
            cur.setRightChirld(rightNodeParent);
        }


        //处理只有一个子节点或者没有子节点的情况
        TreeNode child;
        if(cur.getLeftChirld() != null){
            child = cur.getLeftChirld();
        }else if (cur.getRightChirld() != null){
            child = cur.getRightChirld();
        }else {
            child = null;
        }

        if (prev == null){
            root = child;
        }else if (prev.getLeftChirld() == cur){
            prev.setLeftChirld(child);
        }else {
            prev.setRightChirld(child);
        }
    }

比如我删除51,而有两个节点的情况: 7533C72CA07126E904558905915B5534.png
//后序遍历
public void postOrder(TreeNode treeNode){
        if (treeNode == null){
            return;
        }

        postOrder(treeNode.getLeftChirld());
        postOrder(treeNode.getRightChirld());
        System.out.println(treeNode.getData());
    }

  //中序遍历
    void inOrder(TreeNode treeNode){
        if (treeNode == null){
            return;
        }

        inOrder(treeNode.getLeftChirld());
        System.out.println(treeNode.getData());
        inOrder(treeNode.getRightChirld());
    }

    //前序遍历
    void preOrder(TreeNode treeNode){
        if (treeNode == null){
            return;
        }

        System.out.println(treeNode.getData());
        preOrder(treeNode.getLeftChirld());
        preOrder(treeNode.getRightChirld());
    }

相关文章

  • 数据结构与算法——红黑树

    前面我们提到了二叉查找树,支持快速的查找、插入和删除操作。中序遍历二叉查找树,可以输出有序的数据序列,非常高效。 ...

  • 701. 二叉搜索树中的插入、搜索、删除操作

    二叉搜索树中的插入、搜索、删除操作

  • 二叉查找树的搜索、插入、删除、遍历等操作

    节点结构,每个节点保存left节点 & right节点,以及当前节点的数据 二叉树结构 搜索,使用递归 插入操作,...

  • 第四讲-树(中)

    树(中) 二叉搜索(排序/查找)树 作用:为了进行二分查找,将数据构建在查找树中,相比与线性结构树的插入删除等动态...

  • 剑指offer中关于二叉树题目的总结

    关于二叉树的问题,也就是涉及二叉树的四种遍历算法以及基本的删除、插入等操作 中序遍历和前序遍历/后序遍历的结合 题...

  • 二叉树 堆 2019-04-17

    二叉树 实现一个二叉查找树,并且支持插入、删除、查找操作 实现查找二叉查找树中某个节点的后继、前驱节点 实现二叉树...

  • 二叉树(下)

    二叉树中有种特殊的树是二叉查找树,其最大的特点就是,支持动态的快速插入、删除、查找操作。 其实除了二叉查找树外,散...

  • 红黑树

    红黑树 红黑树和平衡二叉查找树(AVL树)类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获...

  • 7天练|Day5:二叉树和堆

    关于二叉树和堆的7个必知必会的代码实现二叉树实现一个二叉查找树,并且支持插入、删除、查找操作实现查找二叉查找树中某...

  • 24-二叉树基础(下):有了如此高效的散列表,为什么还需要二叉树

    今天来学习一种特殊的的二叉树二叉查找树。二叉查找树最大的特点就是支持动态数据集合的快速插入、删除、查找操作。 我们...

网友评论

      本文标题:二叉查找树的搜索、插入、删除、遍历等操作

      本文链接:https://www.haomeiwen.com/subject/zxswohtx.html