java二叉树的数据插入算法介绍

 更新时间:2021年12月20日 15:09:45   作者:Code丨Monkey  
大家好,本篇文章主要讲的是java二叉树的数据插入算法介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览

例题:

leetcode 第701题

二叉树插入数据

题目:

给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。

对于二叉树的遍历有三种方式

前序遍历:根左右 的顺序
中序遍历:左根右 的顺序
后序遍历:左右根 的顺序

二叉树插入数据的原理/思路是什么?

二叉树的左侧的数会比右侧的数小,所以我们用需要插入的数据和根节点的值比较大小,如果插入的数据大于根节点,那么根节点就转移到右侧的节点上,此时重复上面的操作即可完成插入。

我们读一下TreeNode代码段:

class TreeNode {
      int val;
      TreeNode left;
      TreeNode right;
      TreeNode() {}
      TreeNode(int val) { this.val = val; }
      TreeNode(int val, TreeNode left, TreeNode right) {
          this.val = val;
          this.left = left;
          this.right = right;
      }
}

很显然,二叉树之间是通过left,right来链接的,和ListNode的next非常的相似,只不过二叉树是双向链接,而链表则是单向。所以我们就需要获取到父节点,用父节点的leftright来链接插入的数。

那么我们如何获取到能正确插入该数据的节点呢?

1.我们可以通过循环移动节点的方式,来获取最后一个不为空的节点

 //定义一个父级二叉树 用来记录上个操作的节点
        TreeNode parent =root,cur=root;
        while(cur!=null){
            //如果p部位空的话,就和val比较来进行节点的移动
            parent = cur; //记录上一个节点,用于最后的链接
            cur = cur.val<val?cur.right:cur.left;//节点进行移动。
        }

2.然后用最后一个不为空的节点的值与插入值进行比较插入即可,小的则插入左侧,大的则插入右侧。

代码实现

if(parent.val>val){
            //如果父级的val是大于输入的val,那么插在左边
            parent.left = new TreeNode(val);
        }else{
            //否则插在右边
            parent.right = new TreeNode(val);
        }

整体代码

 if (root == null){
            return new TreeNode(val);
        }
        //定义一个父级二叉树 用来记录上个操作的节点
        TreeNode parent =root,cur=root;
        while(cur!=null){
            //如果p部位空的话,就和val比较来进行节点的移动
            parent = cur; //记录上一个节点,用于最后的链接
            cur = cur.val<val?cur.right:cur.left;//节点进行移动。
        }
        if(parent.val>val){
            //如果父级的val是大于输入的val,那么插在左边
            parent.left = new TreeNode(val);
        }else{
            //否则插在右边
            parent.right = new TreeNode(val);
        }
        return root;

当然,因为节点的移动一直重复一个操作,我们可以用更简单的递归实现

 public TreeNode insertIntoBST(TreeNode root, int val) {
          if (root == null){
            return new TreeNode(val);
          }
          if(root.val<val){
              //因为父节点的值小于插入值,则要进行节点的右移
              root.right = insertIntoBST(root.right,val);
          }else{
              root.left = insertIntoBST(root.left,val);
          }
        return root;
    }

全部代码

package JAVA算法.LeetCode;

public class t701 {
    /**
    701. 二叉搜索树中的插入操作
    二叉树分为前序插入,中序插入,后序插入
    解决思路 1.利用迭代思想实现二叉树的插入
     */

}


class TreeNode {
      int val;
      TreeNode left;
      TreeNode right;
      TreeNode() {}
      TreeNode(int val) { this.val = val; }
      TreeNode(int val, TreeNode left, TreeNode right) {
          this.val = val;
          this.left = left;
          this.right = right;
      }
}

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */


class Solution {
    /*
        二叉树插入原理:
        1.前序插入(根左右) 如果插入的树大于根,数则往右侧移动,与右侧分支的根进行比较,然后重复前面的操作
        */
    public TreeNode insertIntoBST(TreeNode root, int val) {
        //当传入的根节点为空,则将传入的值设置为节点
        if (root == null){
            //如果tree为空的,那么就创建一个新的二叉并赋值
            return new TreeNode(val);
        }

        if (root.val<val){
            //当当前的值是大于左侧的值,则往右侧移动
            root.right=insertIntoBST(root.right,val);
        }else{
            //反之
            root.left=insertIntoBST(root.left,val);
        }
        return root;
    }


    //解法2:循环判断
    public TreeNode insertIntoBST2(TreeNode root, int val) {
        if (root == null){
            return new TreeNode(val);
        }
        TreeNode parent=root,p=root;
        while(true){
            if (p!=null){
                parent = p; //记录上个节点
                p = p.val>val?p.left:p.right;
            }else{
                //当p为null了,则已经找到位置了,现在则需要将值进行插入
                if (parent.val>val){
                    parent.left = new TreeNode(val);
                }else{
                    parent.right = new TreeNode(val);
                }
                break;
            }

        }
        return root;
    }
    //解法三:循环遍历,

    /**
     *
     * @param root
     * @param val
     * @return
     *
     * 解法思路:我们先通过一个循环找到能插入位置的父节点,
     * 然后我们就对值与父节点的值进行比较,如果该值小于父节点的话我们就插入在父节点的左侧
     */
    public TreeNode insertBST3(TreeNode root,int val){
        if (root == null){
            return new TreeNode(val);
        }
        //定义一个父级二叉树 用来记录上个操作的节点
        TreeNode parent =root,p=root;
        while(p!=null){
            //如果p部位空的话,就和val比较来进行节点的移动
            parent = p; //记录上一个节点,用于最后的链接
            p = p.val<val?p.right:p.left;//节点进行移动。
        }
        if(parent.val>val){
            //如果父级的val是大于输入的val,那么插在左边
            parent.left = new TreeNode(val);
        }else{
            //否则插在右边
            parent.right = new TreeNode(val);
        }

        return root;
    }


}


到此这篇关于java二叉树的数据插入算法介绍的文章就介绍到这了,更多相关java二叉树内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • j2ee mybatis注解@Data,@TableName,@TableField使用方式

    j2ee mybatis注解@Data,@TableName,@TableField使用方式

    这篇文章主要介绍了j2ee mybatis注解@Data,@TableName,@TableField使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • DecimalFormat数字格式化用法详解

    DecimalFormat数字格式化用法详解

    这篇文章主要为大家详细介绍了DecimalFormat数字格式化用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 举例讲解Java的Spring框架中AOP程序设计方式的使用

    举例讲解Java的Spring框架中AOP程序设计方式的使用

    这篇文章主要介绍了Java的Spring框架中AOP程序设计方式的使用讲解,文中举的AOP下抛出异常的例子非常实用,需要的朋友可以参考下
    2016-04-04
  • 利用Java+MySQL实现附近功能实例

    利用Java+MySQL实现附近功能实例

    现在很多手机软件都用附近搜索功能,但具体是怎么实现的呢?下面这篇文章就来给大家介绍关于利用Java+MySQL实现附近功能的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-12-12
  • 使用@Transactional 设置嵌套事务不回滚

    使用@Transactional 设置嵌套事务不回滚

    这篇文章主要介绍了使用@Transactional 设置嵌套事务不回滚问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java中ArrayList的常见用法示例小结

    Java中ArrayList的常见用法示例小结

    本文介绍了Java的ArrayList,它是一个动态数组,可以自动调整大小,支持添加、删除、获取元素等操作,同时,还讨论了如何存储基本数据类型以及在多线程环境下的使用注意事项,感兴趣的朋友一起看看吧
    2025-02-02
  • Java BigDecimal类的使用和注意事项

    Java BigDecimal类的使用和注意事项

    这篇文章主要讲解Java中BigDecimal类的用法,并简单介绍一些注意事项,希望能给大家做一个参考。
    2016-06-06
  • javafx实现五子棋游戏

    javafx实现五子棋游戏

    这篇文章主要为大家详细介绍了javafx实现五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • 一个简单JDK版动态代理

    一个简单JDK版动态代理

    这篇文章主要为大家详细介绍了一个简单JDK版动态代理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • Spring MVC创建项目踩过的bug

    Spring MVC创建项目踩过的bug

    这篇文章主要介绍了Spring MVC创建项目踩过的bug,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11

最新评论