您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java數據結構之二叉搜索樹實例分析”,在日常操作中,相信很多人在Java數據結構之二叉搜索樹實例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java數據結構之二叉搜索樹實例分析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
二叉搜索樹或者是一棵空樹,或者是具有下列性質的一棵二叉樹,如果當前節點具有左子樹,則左子樹上的每一個節點值均小于等于當前節點值,如果當前節點具有右子樹,則右子樹上的每一個節點值均大于等于當前節點值。依據這個性質,當我們前序遍歷二叉搜索樹的時候,得到的序列應該是從小到大的非遞減序列。同時搜索指定值時,只需要與當前節點比較,根據相對大小在左子樹或者右子樹上進行搜索。
根據二叉搜索樹的性質我們接下來需要實現插入節點,查詢節點,刪除節點功能。
public class TreeNode { public int val; public TreeNode left; public TreeNode right; public TreeNode() { } public TreeNode(int val) { this.val = val; } public TreeNode(int val, TreeNode left, TreeNode right) { this.val = val; this.left = left; this.right = right; } }
這里我們假設所有節點值大于0,初始化一個頭節點。ps:對于樹,鏈表這類數據結構,為了使第一個節點操作與其他節點保持一致,方便操作,常見的方法是添加一個額外的頭節點,指向第一個節點。
TreeNode head; private void init() { //添加一個頭節點 head = new TreeNode(-1); }
從頭節點開始我們遍歷二叉搜索樹,如果當前節點值小于等于插入節點值,則插入節點在當前節點的右子樹上,否則在左子樹上,一直深度遍歷知道當前節點的右子樹(左子樹)為空,則插入。
/** * 插入新節點,假設新節點均大于0 * @param val 插入節點值 * @return 插入的節點 */ public TreeNode insert(int val) { TreeNode temp = head; while (true) { if (temp.val < val) { //val應該在右子樹上 if (null != temp.right) { temp = temp.right; continue; } else { temp.right = new TreeNode(val); return temp.right; } } //應該在左子樹上 if (null != temp.left) { temp = temp.left; continue; } temp.left = new TreeNode(val); return temp.left; } }
查找節點的步驟其實在插入節點的時候已經有體現,其實就是將查找值與當前節點比較,大于當前節點走右子樹,小于當前節點走左子樹,直到值匹配返回節點,或者沒有找到返回null。ps:這里為了后面方便實現刪除,同時返回了當前節點以及當前節點的父節點,這里使用了commons-lang3包下的Pair工具。
/** * 搜索節點值 * @param val * @return */ public Pair<TreeNode, TreeNode> find(int val) { TreeNode temp = head.right; TreeNode parent = head; while (null != temp) { if (temp.val == val) { return Pair.of(temp, parent); } parent = temp; if (temp.val < val) { //在右子樹上 temp = temp.right; continue; } temp = temp.left; } return null; }
刪除節點時候我們需要先找到刪除節點的位置,然后做對應操作。有三種情況:
1.如果刪除的是葉子節點直接刪除
2.如果刪除的節點只有左子樹或者右子樹,則直接將左子樹或者右子樹節點放在刪除節點位置
3.如果刪除節點同時有左子樹和右子樹,則將右子樹節點放在原來節點位置,將左子樹放在右子樹最左邊節點左子樹上(反之將左子樹放在原來節點位置,右子樹放在左子樹最右邊節點右子樹上也可)
/** * 1.如果刪除的是葉子節點直接刪除, * 2.如果刪除的節點只有左子樹或者右子樹,則直接將左子樹或者右子樹節點放在刪除節點位置 * 3.如果刪除節點同時右左子樹和右子樹,則將右子樹節點放在原來節點位置,將左子樹放在右子樹最左邊節點左子樹上 * @param val */ public void delete(int val) { //找到刪除節點,刪除節點父節點 Pair<TreeNode, TreeNode> curAndParent = this.find(val); TreeNode cur = curAndParent.getLeft(); TreeNode parent = curAndParent.getRight(); //記錄刪除當前節點后,當前節點位置放置哪個節點 TreeNode changed; if (null == cur.left && null == cur.right) { changed = null; } else if (null != cur.left && null != cur.right) { TreeNode tempRight = cur.right; while (null != tempRight.left) { //找到最左側節點 tempRight = tempRight.left; } tempRight.left = cur.left; changed = cur.right; } else if (null != cur.left) { changed = cur.left; } else { changed = cur.right; } if (parent.left == cur) { parent.left = changed; return; } parent.right = changed; }
到此,關于“Java數據結構之二叉搜索樹實例分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。