日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

数据结构 - 从二叉搜索树说到AVL树(一)之二叉搜索树的操作与详解(Java)

發布時間:2025/3/15 java 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构 - 从二叉搜索树说到AVL树(一)之二叉搜索树的操作与详解(Java) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  二叉搜索樹(Binary Search Tree),簡稱BST,顧名思義,一顆可以用于搜索的二叉樹。BST在數據結構中占有很重要的地位,一些高級樹結構都是其的變種,例如AVL樹、紅黑樹等,因此理解BST對于后續樹結構的學習有很好的作用。同時利用BST可以進行排序,稱為二叉排序,也是很重要的一種思想。

  二叉樹的性質:任意一個節點的所有左子樹元素都比該元素值要小,而所有右子樹元素都比該元素值要大。

  符合該性質的二叉樹就是一顆二叉搜索樹,當然前提下是樹中不允許有重復元素。

  所有的二叉搜索樹的中序遍歷序列都是一個順序序列, 以下的幾種都是二叉搜索樹

  

  接下來講二叉搜索樹的三個主要操作:查找,增加,刪除。

  一、查找

    二叉搜索樹本來就是用于查找數據的一種結構,主要步驟是:

      ① 選擇根節點作為當前節點

      ② 如果當前節點為null,則返回false表示找不到該元素

      ③ 如果當前節點不為null,判斷當前節點是否與所搜索元素相等,如相等,則返回true表示能找到該元素

      ④ 如果當前節點的值比所搜索值小,則選擇當前節點的左節點作為當前節點,比搜索值大則選擇右節點作為當前節點,然后從②循環過程

  二、增加

    二叉搜索樹增加節點重點是根據查找元素的過程找到該節點的插入位置:

      ① 如果根節點為空,則當前插入(增加)的節點為二叉樹的根,如根節點不為空,設置根節點為當前節點

      ② 如果當前節點的值與插入節點的值相等,返回false表示插入失敗,節點值已存在于樹中

      ③ 若插入節點的值比當前節點的值小,且當前節點的左子樹為空,則把插入節點增加到當前節點的左子樹,并返回true表示插入成功,如左子樹不為空,設置當前節點的左子樹為當前節點。

        如果插入節點的值比當前節點的值大,且當前節點的右子樹為空,則把插入節點增加到當前節點的右子樹,并返回true,如右子樹不為空,設置當前節點的右子樹為當前節點。

        從②循環過程

    具體代碼如下:

public boolean insert(int elem) {TreeNode node = new TreeNode(elem);if (null == this.root) {this.root = node;return true;} else {return insertChild(this.root, node);}} /*** insert the newNode to the child position of parent node* @param parent* @param newNode* @return true if the newNode insert successfully or false if the newNode have been exist*/private boolean insertChild(TreeNode parent, TreeNode newNode) {if (parent.getElem() == newNode.getElem()) {return false;} else if (parent.getElem() > newNode.getElem()) {if (null == parent.getLeft()) {parent.setLeft(newNode);newNode.setParent(parent);return true;} else {return insertChild(parent.getLeft(), newNode);}} else {if (null == parent.getRight()) {parent.setRight(newNode);newNode.setParent(parent);return true;} else {return insertChild(parent.getRight(), newNode);}}}

  三、刪除

    二叉搜索樹的刪除操作重點在于刪除這個節點之后對其他節點的重組,根據刪除節點位置又分為以下幾種情況:

      情況1 刪除節點為葉子節點:直接刪除這個節點(把父節點對應的子樹設為空)

      情況2 刪除節點只有左子樹或只有右子樹:用左子樹或者右子樹代替被刪除節點(把父節點對應的子樹指向刪除節點的左子樹或者右子樹,并把左子樹或右子樹的父節點指向刪除節點的父節點)

      *情況3 刪除節點的左子樹和右子樹均不為空:找到刪除節點的直接前驅節點,用該前驅節點的值替換待刪除節點的值,然后把這個前驅節點當做待刪除節點,則該情況轉換成情況1或者情況2

      比如想刪除節點 4

    

?

?     找到節點4的直接前驅節點3,用節點3的值代替節點4的值,然后情況換成刪除節點3(也就是情況1)。

    具體代碼:

/*** delete the node which element equals to parameter elem* @param elem* @return true if the node can be found and delete otherwise false*/public boolean delete(int elem) {if (null == this.root) {return false;} else {TreeNode node = this.root;// find out the node need to be deletedwhile (null != node) {if (node.getElem() == elem) {deleteNode(node);return true;} else if (node.getElem() > elem) {node = node.getLeft();} else {node = node.getRight();}}return false;}}private void deleteNode(TreeNode node) {if (null == node.getLeft() && null == node.getRight()) {// deleted node is a leaveif (null == node.getParent()) {// deleted node is rootthis.root = null;} else if (node == node.getParent().getLeft()) {// deleted node is the left child of its parentnode.getParent().setLeft(null);} else {// deleted node is the right child of its parentnode.getParent().setRight(null);}} else if (null == node.getLeft()) {// deleted node only hae right childif (null == node.getParent()) {this.root = node.getRight();} else if (node == node.getParent().getLeft()) {node.getParent().setLeft(node.getRight());} else {node.getParent().setRight(node.getRight());}node.getRight().setParent(node.getParent());} else if (null == node.getRight()) {// deleted node only have left childif (null == node.getParent()) {this.root = node.getLeft();} else if (node == node.getParent().getLeft()) {node.getParent().setLeft(node.getLeft());} else {node.getParent().setRight(node.getLeft());}node.getLeft().setParent(node.getParent());} else {// deleted node have both left & right children// find out the precursor of deleted node// the precursor node replace the position of deleted nodeTreeNode pre = node.getLeft();while (null != pre.getRight()) {pre = pre.getRight();}// swap the elem of precursor node and deleted node// then delete the precursor node TreeUtils.swapTreeElem(pre, node);deleteNode(pre);}}

寫個小程序測試一下:

輸入測試數據:10 5 2 7 6 18 13 -1(-1是結束輸入,不作為一個元素值)

1. insert 2. delete 3. search 4. print 5. exit ->1 ->10 5 2 7 6 18 13 -1 insert success

看一下樹的結構,顯示樹結構的需要順時針轉90°來看,并自己想象節點連線。。

1. insert 2. delete 3. search 4. print 5. exit ->4 -1813 107652 -

刪除節點 5 測試效果

1. insert 2. delete 3. search 4. print 5. exit ->2 ->5 delete success -------------------------------------------------------------- 1. insert 2. delete 3. search 4. print 5. exit ->4 -1813 10762 -

?至此, 二叉搜索樹的操作及具體實現完成,如有不妥之處,歡迎指出斧正。

?

?

尊重知識產權,轉載請標明出處并通知作者。

?

轉載于:https://www.cnblogs.com/GNLin0820/p/9120331.html

總結

以上是生活随笔為你收集整理的数据结构 - 从二叉搜索树说到AVL树(一)之二叉搜索树的操作与详解(Java)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中文字幕一区二区在线播放 | 欧美日韩亚洲国产 | 秋霞视频一区二区 | 五月婷婷在线观看视频 | 日韩福利在线视频 | 久色在线 | 久草久| 国模杨依粉嫩蝴蝶150p | 黄色网页免费看 | 中文字幕观看av | 久久深夜视频 | 中文字幕日本在线观看 | 欧美女同视频 | 色八戒av | 午夜男人影院 | 欧美一区二区在线免费观看 | 亚洲三级在线看 | 国产精品熟女一区二区不卡 | 97视频在线观看免费高清完整版在线观看 | 爱av在线 | 国产精品9 | 在线成人欧美 | av久色| 中文字幕日韩欧美一区二区 | 丰满人妻一区二区三区53号 | 国产精品第十页 | 免费无遮挡无码永久在线观看视频 | 日韩中文久久 | 少妇又紧又深又湿又爽视频 | 成人免费性生活视频 | 欧美色偷偷 | 欧美精品在线免费 | 亚洲成熟丰满熟妇高潮xxxxx | 中文文字幕文字幕高清 | 国产白浆一区二区 | 中出一区二区 | 亚洲xxx视频| 啪啪免费av | 精品熟女一区 | 久久有精品 | 日本艳妇 | 啪啪亚洲 | 欧美精品国产动漫 | 少妇丰满尤物大尺度写真 | 成av人片一区二区三区久久 | 日韩avav| www.黄在线| 亚洲区视频在线观看 | 日本做爰三级床戏 | 亚洲综合久久av一区二区三区 | 亚洲AV午夜成人片 | 日韩精品人妻一区二区三区免费 | 国产成人精品无码播放 | 懂色一区二区三区 | 日本韩国欧美一区二区三区 | 男人日女人免费视频 | 欧美一级黄视频 | 国产一区二区中文字幕 | 羞辱狗奴的句子有哪些 | 久久国产热 | 人人澡人人澡 | 青草国产| 欧洲女性下面有没有毛发 | 日韩人妻无码精品综合区 | 曰韩精品| av老司机在线播放 | 少妇人妻综合久久中文字幕 | 一区二区三区在线看 | 成人在线视频一区二区 | 亚洲国产日韩欧美在线观看 | 一区二区视频在线免费观看 | 国产精品第一国产精品 | 久久日av| 五月天婷婷丁香 | 少妇高潮毛片色欲ava片 | 国产成人在线一区二区 | 国产福利91精品一区二区三区 | 欧美老熟妇喷水 | 精品一区二区三区四区五区 | 请用你的手指扰乱我吧 | 国产乱码久久久久久 | 中文在线√天堂 | 日韩xx视频 | 物业福利视频 | 911香蕉视频 | 日韩福利影院 | 天天干在线播放 | 浪浪视频污 | 欧美精品一区二区免费 | 日韩欧美黄色 | 日韩少妇内射免费播放18禁裸乳 | 国产精品一区二区三区四区视频 | 成人做爰视频www | 国产精品第8页 | 欧美一区二区三区爱爱 | 亚洲精品www. | 国产色在线观看 | 91精品色 | 日韩卡一卡二 |