本篇文章小编给大家分享一下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非常的相似,只不过二叉树是双向链接,而链表则是单向。所以我们就需要获取到父节点,用父节点的left或right来链接插入的数。
那么我们如何获取到能正确插入该数据的节点呢?
1.我们可以通过循环移动节点的方式,来获取最后一个不为空的节点
//定义一个父级二叉树 用来记录上个操作的节点 TreeNode parent =root,cur=root; while(cur!=null){ //如果p部位空的话,就和val比较来进行节点的移动 parent = cur; //记录上一个节点,用于最后的链接 cur = cur.val2.然后用最后一个不为空的节点的值与插入值进行比较插入即可,小的则插入左侧,大的则插入右侧。
代码实现
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.valval){ //如果父级的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全部代码
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.valval?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){ //如果父级的val是大于输入的val,那么插在左边 parent.left = new TreeNode(val); }else{ //否则插在右边 parent.right = new TreeNode(val); } return root; } }
忍者必须死34399账号登录版 最新版v1.0.138v2.0.72
下载勇者秘境oppo版 安卓版v1.0.5
下载忍者必须死3一加版 最新版v1.0.138v2.0.72
下载绝世仙王官方正版 最新安卓版v1.0.49
下载Goat Simulator 3手机版 安卓版v1.0.8.2
Goat Simulator 3手机版是一个非常有趣的模拟游
Goat Simulator 3国际服 安卓版v1.0.8.2
Goat Simulator 3国际版是一个非常有趣的山羊模
烟花燃放模拟器中文版 2025最新版v1.0
烟花燃放模拟器是款仿真的烟花绽放模拟器类型单机小游戏,全方位
我的世界动漫世界 手机版v友y整合
我的世界动漫世界模组整合包是一款加入了动漫元素的素材整合包,
我的世界贝爷生存整合包 最新版v隔壁老王
我的世界MITE贝爷生存整合包是一款根据原版MC制作的魔改整