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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构 - 二叉排序树BST(创建、遍历、删除节点)

發布時間:2023/12/10 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构 - 二叉排序树BST(创建、遍历、删除节点) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數組與鏈表區別:



二叉排序樹的創建和遍歷 代碼實現

package tree.binarysorttree;public class BinarySortTreeDemo {public static void main(String []args){int [] arr = {7,3,10,12,5,1,9};BinarySortTree binarySortTree = new BinarySortTree();//循環添加節點for (int i = 0; i < arr.length; i++) {binarySortTree.add(new Node(arr[i]));}//中序遍歷binarySortTree.infixOrder();} }//創建二叉排序樹 class BinarySortTree{private Node root;//添加節點的方法public void add(Node node){if (root == null){root = node;}else {root.add(node);}}//中序遍歷public void infixOrder(){if (root != null){root.infixOrder();}else {System.out.println("二叉排序樹為空,無法遍歷");}} }//創建節點 class Node{int value;Node left;Node right;public Node(int value) {this.value = value;}//添加節點的方法//遞歸的形式添加節點,滿足二叉排序樹public void add(Node node){if(node == null){return;}if (node.value < this.value){//當前節點的左子節點為空直接掛上if (this.left == null){this.left = node;}else {//不為空遞歸向下this.left.add(node);}}else { //添加的節點的值大于等于當前節點的值,右節點為空,掛到右節點if (this.right == null){this.right = node;}else{//不為空就掛上this.right.add(node);}}}//中序遍歷public void infixOrder(){if (this.left != null){this.left.infixOrder();}System.out.println(this);if (this.right != null){this.right.infixOrder();}}@Overridepublic String toString() {return "Node{" +"value=" + value +'}';} }

刪除:




編寫查找節點的方法

//查找要刪除的節點public Node search(int value){if (root == null){return null;}else {return root.search(value);}}//查找父節點public Node searchParent(int value){if (root == null){return null;}else{return root.searchParent(value);}}

刪除第三種需要用到的,查找以target.right為根節點節點的樹的最小值并刪除,然后返回value

//編寫一個方法,查找以傳入節點為根節點的二叉排序樹中的最小節點的值,并刪除此節點public int delRightTreeMin(Node node){Node target = node;//循環查找左節點,就會找到最小值while(target.left != null){target = target.left;}//刪除最小節點delNode(target.value);return target.value;}

刪除節點方法

public void delNode(int value){if (root == null){return;}else {//1.找到要刪除的節點Node targetNode = search(value);if (targetNode == null){return;}//如果二叉排序樹只有一個節點,并且刪除的此節點if (root.left == null && root.right == null){root = null;return;}//找到父節點Node parent = searchParent(value);//如果刪除的節點是葉子節點if (targetNode.left == null && targetNode.right == null){//第一種,刪除葉子if (targetNode.value < parent.value){ //比較大小判斷刪除的左葉子還是右葉子parent.left = null;}else {parent.right = null;}}else if (targetNode.left != null && targetNode.right != null){//刪除有兩棵子樹的(因為第二種判斷比較麻煩,所以直接寫在else里)//從target的右子樹找到最小節點,//用一個臨時變量存儲這個最小節點的value//刪除最小節點int min = delRightTreeMin(targetNode.right);//把最小節點的值賦給targetNodetargetNode.value = min;}else {//第二種,只有一棵子樹//如果要刪除的節點有左子節點if (targetNode.left != null){//如果只有根節點和一個葉子節點,要刪除根節點,那就要判斷根節點的父節點是否為空if (parent != null) {//如果targetNode是parent的左子節點if (parent.left.value == value) {parent.left = targetNode.left;} else {//targetNode是parent的右子節點parent.right = targetNode.left;}}else {root = targetNode.left;}}else {//要刪除的節點有右子節點if (parent != null) {if (parent.left.value == value) {//如果targetNode是parent的左子節點parent.left = targetNode.right;} else {//targetNode是parent的右子節點parent.right = targetNode.right;}}else {root = targetNode.right;}}}}}

完整代碼

package tree.binarysorttree;public class BinarySortTreeDemo {public static void main(String []args){int [] arr = {7,3,10,12,5,1,9,2};BinarySortTree binarySortTree = new BinarySortTree();//循環添加節點for (int i = 0; i < arr.length; i++) {binarySortTree.add(new Node(arr[i]));}//中序遍歷binarySortTree.infixOrder();//測試刪除binarySortTree.delNode(2);binarySortTree.delNode(5);binarySortTree.delNode(9);binarySortTree.delNode(12);binarySortTree.delNode(7);binarySortTree.delNode(3);binarySortTree.delNode(10);System.out.println();binarySortTree.infixOrder();} }//創建二叉排序樹 class BinarySortTree{private Node root;public Node getRoot() {return root;}//查找要刪除的節點public Node search(int value){if (root == null){return null;}else {return root.search(value);}}//查找父節點public Node searchParent(int value){if (root == null){return null;}else{return root.searchParent(value);}}//編寫一個方法,查找以傳入節點為根節點的二叉排序樹中的最小節點的值,并刪除此節點public int delRightTreeMin(Node node){Node target = node;//循環查找左節點,就會找到最小值while(target.left != null){target = target.left;}//刪除最小節點delNode(target.value);return target.value;}//刪除節點public void delNode(int value){if (root == null){return;}else {//1.找到要刪除的節點Node targetNode = search(value);if (targetNode == null){return;}//如果二叉排序樹只有一個節點,并且刪除的此節點if (root.left == null && root.right == null){root = null;return;}//找到父節點Node parent = searchParent(value);//如果刪除的節點是葉子節點if (targetNode.left == null && targetNode.right == null){//第一種,刪除葉子if (targetNode.value < parent.value){ //比較大小判斷刪除的左葉子還是右葉子parent.left = null;}else {parent.right = null;}}else if (targetNode.left != null && targetNode.right != null){//刪除有兩棵子樹的(因為第二種判斷比較麻煩,所以直接寫在else里)//從target的右子樹找到最小節點,//用一個臨時變量存儲這個最小節點的value//刪除最小節點int min = delRightTreeMin(targetNode.right);//把最小節點的值賦給targetNodetargetNode.value = min;}else {//第二種,只有一棵子樹//如果要刪除的節點有左子節點if (targetNode.left != null){//如果只有根節點和一個葉子節點,要刪除根節點,那就要判斷根節點的父節點是否為空if (parent != null) {//如果targetNode是parent的左子節點if (parent.left.value == value) {parent.left = targetNode.left;} else {//targetNode是parent的右子節點parent.right = targetNode.left;}}else {root = targetNode.left;}}else {//要刪除的節點有右子節點if (parent != null) {if (parent.left.value == value) {//如果targetNode是parent的左子節點parent.left = targetNode.right;} else {//targetNode是parent的右子節點parent.right = targetNode.right;}}else {root = targetNode.right;}}}}}//添加節點的方法public void add(Node node){if (root == null){root = node;}else {root.add(node);}}//中序遍歷public void infixOrder(){if (root != null){root.infixOrder();}else {System.out.println("二叉排序樹為空,無法遍歷");}} }//創建節點 class Node{int value;Node left;Node right;public Node(int value) {this.value = value;}//查找要刪除的節點public Node search(int value){if (value == this.value){//找到return this;}else if(value < this.value){//應該向左繼續查找//如果左子節點為空就不能找了,說明不存在if (this.left == null) {return null;}return this.left.search(value);}else {if (this.right == null){return null;}return this.right.search(value);}}//查找要刪除節點的父節點public Node searchParent(int value){if ((this.left != null && this.left.value == value)||(this.right != null && this.right.value == value)){return this;}else {//如果查找的值小于當前節點的值,并且當前節點的左子節點不為空if (value < this.value && this.left != null){return this.left.searchParent(value);//像左子樹遞歸查找}else if (value >= this.value && this.right != null){return this.right.searchParent(value);//像右子樹遞歸查找}else {return null; //沒有父節點}}}//添加節點的方法//遞歸的形式添加節點,滿足二叉排序樹public void add(Node node){if(node == null){return;}if (node.value < this.value){//當前節點的左子節點為空直接掛上if (this.left == null){this.left = node;}else {//不為空遞歸向下this.left.add(node);}}else { //添加的節點的值大于等于當前節點的值,右節點為空,掛到右節點if (this.right == null){this.right = node;}else{//不為空就掛上this.right.add(node);}}}//中序遍歷public void infixOrder(){if (this.left != null){this.left.infixOrder();}System.out.println(this);if (this.right != null){this.right.infixOrder();}}@Overridepublic String toString() {return "Node{" +"value=" + value +'}';} }

總結

以上是生活随笔為你收集整理的数据结构 - 二叉排序树BST(创建、遍历、删除节点)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 草草草在线观看 | 久久久噜噜噜www成人网 | 国产一区日韩精品 | 欧美视频网站 | 九九这里只有精品视频 | 国产精品宾馆在线精品酒店 | 久久久社区 | 日韩不卡一二区 | 黄色片xxxx | 免费一级淫片 | 免费看欧美黑人毛片 | 欧美日韩视频 | 男朋友是消防员第一季 | 男女裸体无遮挡做爰 | 69堂免费视频 | 欧美性受黑人性爽 | 成人动漫一区二区三区 | 精品99在线 | 看一级黄色| 婷婷99| 欧美大波大乳巨大乳 | 一个色综合久久 | 国产清纯白嫩初高中在线观看性色 | 51ⅴ精品国产91久久久久久 | 日本伊人网 | 黄大色黄大片女爽一次 | 日中文字幕 | 成人av图片| 国产精品久久久久aaaa | 羞羞的软件 | 五月天婷婷丁香花 | 他趴在我两腿中间添得好爽在线看 | 成人激情五月天 | 欧美激情电影一区二区 | 国产男人搡女人免费视频 | 精品国产av一区二区 | 中文字幕在线官网 | 日韩videos | 宅男噜噜噜66一区二区 | 久久夜色精品国产欧美乱极品 | 日产毛片 | 天天干视频在线观看 | 欧洲国产视频 | 91在线超碰 | av高潮| 国产剧情在线观看 | 寻找身体恐怖电影免费播放 | 四虎视频国产精品免费 | 潘金莲裸体一级淫片视频 | 爱爱一级 | 午夜a级片 | 久久久久久久久久久网站 | 亚洲第三色 | 亚洲天堂不卡 | 四虎永久在线精品免费网址 | 超碰c | 91丨国产丨捆绑调教 | 国产91精品一区 | 欧美一级淫片免费视频黄 | 丝袜av网站 | 日韩乱码视频 | 日韩一级二级视频 | 秘密基地在线观看完整版免费 | 7777精品久久久久久 | 中文字幕视频免费 | 91爱爱com| 性感少妇av| 欧美日韩高清在线 | 91精品国产99久久久久久红楼 | 久久久18禁一区二区三区精品 | 99riav国产精品视频 | 日韩精品极品视频 | 九九免费在线视频 | 在线电影一区 | 欧美丰满老妇性猛交 | 国产精品一区二区三区久久 | 欧美精品黄色片 | 国产91专区 | 超碰在线免费97 | 午夜精品久久久久久久爽 | 天天干,天天爽 | 97国产精东麻豆人妻电影 | 蘑菇av| 国产午夜大片 | 日韩人妻一区二区三区蜜桃视频 | 免费看av的网址 | 91中文字幕在线观看 | 脱美女衣服亲摸揉视频 | 三级在线视频 | 黑人玩弄人妻一区二 | 美女一二三区 | 好男人.www | 国产v亚洲v天堂无码久久久 | 91无打码| 亚洲国产精品视频在线观看 | 中出白浆 | 婚后打屁股高h1v1调教 | 亚洲专区在线视频 | 亚洲黄网在线观看 |