我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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 {
    

}


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 {
    
    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;
    }
    //解法三:循环遍历,

    
    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二叉树内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java二叉树中数据插入算法的示例分析

这篇文章主要介绍java二叉树中数据插入算法的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!例题:leetcode 第701题二叉树插入数据题目:给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉
2023-06-22

Java编程求二叉树的镜像两种方法介绍

给出一棵二叉树,求它的镜像,如下图:右边是二叉树是左边二叉树的镜像。仔细分析这两棵树的特点,看看能不能总结出求镜像的步骤。这两棵树的根节点相同,但他们的左右两个子节点交换了位置。因此我们不妨先在树中交换根节点的两个子节点,就得到了下面一幅图
2023-05-30

Java怎么实现二叉搜索树的插入、删除功能

这篇文章给大家介绍Java怎么实现二叉搜索树的插入、删除功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java的特点有哪些Java的特点有哪些 1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允
2023-06-26

Java算法中二叉树的练习题有哪些

小编给大家分享一下Java算法中二叉树的练习题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!题目一 解法/** * Definition for a bin
2023-06-29

php二叉树的遍历以及进行逻辑操作的方法介绍

本篇内容主要讲解“php二叉树的遍历以及进行逻辑操作的方法介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php二叉树的遍历以及进行逻辑操作的方法介绍”吧!首先,我们还是要说明一下,我们学习的
2023-06-20

Java二叉搜索树与数组查找的方法

本篇内容介绍了“Java二叉搜索树与数组查找的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!题目一 解法/** * Definition
2023-06-29

C语言数据结构二叉树递归的方法

本篇内容介绍了“C语言数据结构二叉树递归的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、二叉树的遍历算法二叉树的精髓在于遍历。遍历掌
2023-06-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录