java二叉樹的數(shù)據(jù)插入算法介紹
例題:
leetcode 第701題
題目:
給定二叉搜索樹(BST)的根節(jié)點和要插入樹中的值,將值插入二叉搜索樹。 返回插入后二叉搜索樹的根節(jié)點。 輸入數(shù)據(jù) 保證 ,新值和原始二叉搜索樹中的任意節(jié)點值都不同。
對于二叉樹的遍歷有三種方式
前序遍歷:根左右 的順序
中序遍歷:左根右 的順序
后序遍歷:左右根 的順序
二叉樹插入數(shù)據(jù)的原理/思路是什么?
二叉樹的左側的數(shù)會比右側的數(shù)小,所以我們用需要插入的數(shù)據(jù)和根節(jié)點的值比較大小,如果插入的數(shù)據(jù)大于根節(jié)點,那么根節(jié)點就轉移到右側的節(jié)點上,此時重復上面的操作即可完成插入。
我們讀一下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非常的相似,只不過二叉樹是雙向鏈接,而鏈表則是單向。所以我們就需要獲取到父節(jié)點,用父節(jié)點的left
或right
來鏈接插入的數(shù)。
那么我們如何獲取到能正確插入該數(shù)據(jù)的節(jié)點呢?
1.我們可以通過循環(huán)移動節(jié)點的方式,來獲取最后一個不為空的節(jié)點
//定義一個父級二叉樹 用來記錄上個操作的節(jié)點 TreeNode parent =root,cur=root; while(cur!=null){ //如果p部位空的話,就和val比較來進行節(jié)點的移動 parent = cur; //記錄上一個節(jié)點,用于最后的鏈接 cur = cur.val<val?cur.right:cur.left;//節(jié)點進行移動。 }
2.然后用最后一個不為空的節(jié)點的值與插入值進行比較插入即可,小的則插入左側,大的則插入右側。
代碼實現(xiàn)
if(parent.val>val){ //如果父級的val是大于輸入的val,那么插在左邊 parent.left = new TreeNode(val); }else{ //否則插在右邊 parent.right = new TreeNode(val); }
整體代碼
if (root == null){ return new TreeNode(val); } //定義一個父級二叉樹 用來記錄上個操作的節(jié)點 TreeNode parent =root,cur=root; while(cur!=null){ //如果p部位空的話,就和val比較來進行節(jié)點的移動 parent = cur; //記錄上一個節(jié)點,用于最后的鏈接 cur = cur.val<val?cur.right:cur.left;//節(jié)點進行移動。 } if(parent.val>val){ //如果父級的val是大于輸入的val,那么插在左邊 parent.left = new TreeNode(val); }else{ //否則插在右邊 parent.right = new TreeNode(val); } return root;
當然,因為節(jié)點的移動一直重復一個操作,我們可以用更簡單的遞歸實現(xiàn)
public TreeNode insertIntoBST(TreeNode root, int val) { if (root == null){ return new TreeNode(val); } if(root.val<val){ //因為父節(jié)點的值小于插入值,則要進行節(jié)點的右移 root.right = insertIntoBST(root.right,val); }else{ root.left = insertIntoBST(root.left,val); } return root; }
全部代碼
package JAVA算法.LeetCode; public class t701 { /** 701. 二叉搜索樹中的插入操作 二叉樹分為前序插入,中序插入,后序插入 解決思路 1.利用迭代思想實現(xiàn)二叉樹的插入 */ } 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.前序插入(根左右) 如果插入的樹大于根,數(shù)則往右側移動,與右側分支的根進行比較,然后重復前面的操作 */ public TreeNode insertIntoBST(TreeNode root, int val) { //當傳入的根節(jié)點為空,則將傳入的值設置為節(jié)點 if (root == null){ //如果tree為空的,那么就創(chuàng)建一個新的二叉并賦值 return new TreeNode(val); } if (root.val<val){ //當當前的值是大于左側的值,則往右側移動 root.right=insertIntoBST(root.right,val); }else{ //反之 root.left=insertIntoBST(root.left,val); } return root; } //解法2:循環(huán)判斷 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; //記錄上個節(jié)點 p = p.val>val?p.left:p.right; }else{ //當p為null了,則已經(jīng)找到位置了,現(xiàn)在則需要將值進行插入 if (parent.val>val){ parent.left = new TreeNode(val); }else{ parent.right = new TreeNode(val); } break; } } return root; } //解法三:循環(huán)遍歷, /** * * @param root * @param val * @return * * 解法思路:我們先通過一個循環(huán)找到能插入位置的父節(jié)點, * 然后我們就對值與父節(jié)點的值進行比較,如果該值小于父節(jié)點的話我們就插入在父節(jié)點的左側 */ public TreeNode insertBST3(TreeNode root,int val){ if (root == null){ return new TreeNode(val); } //定義一個父級二叉樹 用來記錄上個操作的節(jié)點 TreeNode parent =root,p=root; while(p!=null){ //如果p部位空的話,就和val比較來進行節(jié)點的移動 parent = p; //記錄上一個節(jié)點,用于最后的鏈接 p = p.val<val?p.right:p.left;//節(jié)點進行移動。 } if(parent.val>val){ //如果父級的val是大于輸入的val,那么插在左邊 parent.left = new TreeNode(val); }else{ //否則插在右邊 parent.right = new TreeNode(val); } return root; } }
到此這篇關于java二叉樹的數(shù)據(jù)插入算法介紹的文章就介紹到這了,更多相關java二叉樹內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
mybatis簡介與配置_動力節(jié)點Java學院整理
這篇文章主要介紹了mybatis簡介與配置,介紹了MyBatis+Spring+MySql簡單配置,有興趣的可以了解一下2017-09-09解決jackson反序列化失敗InvalidFormatException:Can not dese
這篇文章主要介紹了解決jackson反序列化失敗InvalidFormatException:Can not deserialize value of type java.util.Date問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12elasticsearch索引index數(shù)據(jù)功能源碼示例
這篇文章主要為大家介紹了elasticsearch索引index功能源碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-04-04