数据结构,二叉搜索树(二)

简介: 本文讲解:二叉搜索树的插入节点。

1. 插入节点

插入节点,在满足二叉搜索树的性质情况下我们可以列出以下几种情况:

    1. 如果树是空树,则之间插入即可。
    2. 如果树不是空树,查找顺序确定插入的位置从而插入新节点。

    (1)树是空树

    我们直接插入一个新节点:

    if(root == null) {
            TreeNode node = new TreeNode(key);//新节点node
            root == node;//把新节点node赋值给root
            return;//结束程序
        }

    image.gif

    以上代码中,key是我们要插入的值,因此我们要new一个新节点node来存放key值。然后直接将新节点node赋值给根节点root即可。


    (2)树不是空树

    按照顺序查找可以插入的位置,插入新节点。插入前的查找插入位置,跟上方的 findNode 方法是一样的,因此我们需要了解到的思想是如何进行插入这个环节。

    在插入节点的操作时,我们要用一个 parent 来代表根节点的双亲结点,因为当根节点往后遍历走到空时我们无法确认要插入到哪个位置,这时可以使用 parent 这个结点作为根节点来插入新节点。

    TreeNode parent = root;//根节点的双亲结点
        TreeNode cur = root; //根节点的代表结点

    image.gif

    当然,我们得使用一个根节点的代表结点 cur 来进行遍历。如何判断插入的位置是 parent 的左子树还是右子树呢?我们可以通过 parent 的 val 值与被插入值 key 进行比较,如果 key 小于 parent 的 val 值则插入到 parent 的左子树否则插入到右子树。因此,我们可以写出以下代码:

    TreeNode node = new TreeNode(key);//创建一个新结点node存放key值
        if(parent.val < key) {
            parent.right = node;//key值大于parent的val值,放在右子树
        }else {
            parent.left = node;//否则放在左子树
        }

    image.gif


    把上述所有的代码综合起来,我们就能组成以下完整的代码。插入节点的方法名我定义为insertNode,当然你也可以根据自己的设计思想设定方法名以及变量名。

    方法内的流程为:1.判断树是否为空,为空直接把插入的结点赋值给根节点。2.找到要插入的位置。3.插入到相应的位置。

    //插入节点
        public void insertNode(int val) {
            if (root == null) {
                root = new TreeNode(key);//新节点就是val值所在的节点
                return;//结束程序
            }
            TreeNode cur = root;//一个cur代替root根节点
            TreeNode parent = null;//根节点的上一个节点
            while(cur != null) {
                if (cur.val == key) {
                    return;//如果这个节点存在直接结束程序
                }else if (cur.val > key) {
                    parent = cur;
                    cur = cur.left;//这个值小于根节点则往左子树走
                }else {
                    parent = cur;
                    cur = cur.right;//这个值大于根节点则往右子树走
                }
            }
            TreeNode node = new TreeNode(key);//使key值成为一个节点
            if (key > parent.val) {
                parent.right = node;//如果key值大于根节点值则把key值所在节点放在根节点右子树
            }else {
                parent.left = node;//否则放在左子树
            }
        }
    }

    image.gif

    相关文章
    |
    7月前
    |
    算法
    【数据结构】二叉搜索树
    【数据结构】二叉搜索树
    42 2
    |
    3月前
    |
    存储 Java Serverless
    【数据结构】哈希表&二叉搜索树详解
    本文详细介绍了二叉搜索树和哈希表这两种数据结构。二叉搜索树是一种特殊二叉树,具有左子树节点值小于根节点、右子树节点值大于根节点的特点,并且不允许键值重复。文章给出了插入、删除和搜索等方法的具体实现。哈希表则通过哈希函数将键名映射为数组下标,实现快速查找,其插入、删除和查找操作时间复杂度理想情况下为O(1)。文中还讨论了哈希函数的设计原则、哈希冲突的解决方法及哈希表的实现细节。
    62 8
    【数据结构】哈希表&二叉搜索树详解
    |
    2月前
    【高阶数据结构】深度探索二叉树进阶:二叉搜索树概念及其高效实现(三)
    【高阶数据结构】深度探索二叉树进阶:二叉搜索树概念及其高效实现
    |
    2月前
    |
    存储
    【高阶数据结构】深度探索二叉树进阶:二叉搜索树概念及其高效实现(二)
    【高阶数据结构】深度探索二叉树进阶:二叉搜索树概念及其高效实现
    |
    2月前
    【高阶数据结构】深度探索二叉树进阶:二叉搜索树概念及其高效实现(一)
    【高阶数据结构】深度探索二叉树进阶:二叉搜索树概念及其高效实现
    |
    2月前
    【数据结构】二叉搜索树的功能实现详解
    【数据结构】二叉搜索树的功能实现详解
    29 0
    |
    6月前
    数据结构学习记录——判断是否为同一颗二叉搜索树(题意理解、求解思路、程序搭建框架、具体函数的实现)
    数据结构学习记录——判断是否为同一颗二叉搜索树(题意理解、求解思路、程序搭建框架、具体函数的实现)
    59 2
    |
    6月前
    |
    机器学习/深度学习
    数据结构学习记录——堆的小习题(对由同样的n个整数构成的二叉搜索树(查找树)和最小堆,下面哪个说法是不正确的)
    数据结构学习记录——堆的小习题(对由同样的n个整数构成的二叉搜索树(查找树)和最小堆,下面哪个说法是不正确的)
    42 1
    |
    5月前
    |
    存储
    【数据结构】AVL树——平衡二叉搜索树
    【数据结构】AVL树——平衡二叉搜索树
    |
    5月前
    |
    存储 Linux 数据库
    【数据结构】二叉搜索树——高阶数据结构的敲门砖
    【数据结构】二叉搜索树——高阶数据结构的敲门砖