数据结构 - 二叉排序树BST(创建、遍历、删除节点)
生活随笔
收集整理的這篇文章主要介紹了
数据结构 - 二叉排序树BST(创建、遍历、删除节点)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
數(shù)組與鏈表區(qū)別:
二叉排序樹的創(chuàng)建和遍歷 代碼實(shí)現(xiàn)
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();//循環(huán)添加節(jié)點(diǎn)for (int i = 0; i < arr.length; i++) {binarySortTree.add(new Node(arr[i]));}//中序遍歷binarySortTree.infixOrder();} }//創(chuàng)建二叉排序樹 class BinarySortTree{private Node root;//添加節(jié)點(diǎn)的方法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("二叉排序樹為空,無法遍歷");}} }//創(chuàng)建節(jié)點(diǎn) class Node{int value;Node left;Node right;public Node(int value) {this.value = value;}//添加節(jié)點(diǎn)的方法//遞歸的形式添加節(jié)點(diǎn),滿足二叉排序樹public void add(Node node){if(node == null){return;}if (node.value < this.value){//當(dāng)前節(jié)點(diǎn)的左子節(jié)點(diǎn)為空直接掛上if (this.left == null){this.left = node;}else {//不為空遞歸向下this.left.add(node);}}else { //添加的節(jié)點(diǎn)的值大于等于當(dāng)前節(jié)點(diǎn)的值,右節(jié)點(diǎn)為空,掛到右節(jié)點(diǎn)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 +'}';} }刪除:
編寫查找節(jié)點(diǎn)的方法
//查找要?jiǎng)h除的節(jié)點(diǎn)public Node search(int value){if (root == null){return null;}else {return root.search(value);}}//查找父節(jié)點(diǎn)public Node searchParent(int value){if (root == null){return null;}else{return root.searchParent(value);}}刪除第三種需要用到的,查找以target.right為根節(jié)點(diǎn)節(jié)點(diǎn)的樹的最小值并刪除,然后返回value
//編寫一個(gè)方法,查找以傳入節(jié)點(diǎn)為根節(jié)點(diǎn)的二叉排序樹中的最小節(jié)點(diǎn)的值,并刪除此節(jié)點(diǎn)public int delRightTreeMin(Node node){Node target = node;//循環(huán)查找左節(jié)點(diǎn),就會(huì)找到最小值while(target.left != null){target = target.left;}//刪除最小節(jié)點(diǎn)delNode(target.value);return target.value;}刪除節(jié)點(diǎn)方法
public void delNode(int value){if (root == null){return;}else {//1.找到要?jiǎng)h除的節(jié)點(diǎn)Node targetNode = search(value);if (targetNode == null){return;}//如果二叉排序樹只有一個(gè)節(jié)點(diǎn),并且刪除的此節(jié)點(diǎn)if (root.left == null && root.right == null){root = null;return;}//找到父節(jié)點(diǎn)Node parent = searchParent(value);//如果刪除的節(jié)點(diǎn)是葉子節(jié)點(diǎn)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){//刪除有兩棵子樹的(因?yàn)榈诙N判斷比較麻煩,所以直接寫在else里)//從target的右子樹找到最小節(jié)點(diǎn),//用一個(gè)臨時(shí)變量存儲(chǔ)這個(gè)最小節(jié)點(diǎn)的value//刪除最小節(jié)點(diǎn)int min = delRightTreeMin(targetNode.right);//把最小節(jié)點(diǎn)的值賦給targetNodetargetNode.value = min;}else {//第二種,只有一棵子樹//如果要?jiǎng)h除的節(jié)點(diǎn)有左子節(jié)點(diǎn)if (targetNode.left != null){//如果只有根節(jié)點(diǎn)和一個(gè)葉子節(jié)點(diǎn),要?jiǎng)h除根節(jié)點(diǎn),那就要判斷根節(jié)點(diǎn)的父節(jié)點(diǎn)是否為空if (parent != null) {//如果targetNode是parent的左子節(jié)點(diǎn)if (parent.left.value == value) {parent.left = targetNode.left;} else {//targetNode是parent的右子節(jié)點(diǎn)parent.right = targetNode.left;}}else {root = targetNode.left;}}else {//要?jiǎng)h除的節(jié)點(diǎn)有右子節(jié)點(diǎn)if (parent != null) {if (parent.left.value == value) {//如果targetNode是parent的左子節(jié)點(diǎn)parent.left = targetNode.right;} else {//targetNode是parent的右子節(jié)點(diǎn)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();//循環(huán)添加節(jié)點(diǎn)for (int i = 0; i < arr.length; i++) {binarySortTree.add(new Node(arr[i]));}//中序遍歷binarySortTree.infixOrder();//測(cè)試刪除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();} }//創(chuàng)建二叉排序樹 class BinarySortTree{private Node root;public Node getRoot() {return root;}//查找要?jiǎng)h除的節(jié)點(diǎn)public Node search(int value){if (root == null){return null;}else {return root.search(value);}}//查找父節(jié)點(diǎn)public Node searchParent(int value){if (root == null){return null;}else{return root.searchParent(value);}}//編寫一個(gè)方法,查找以傳入節(jié)點(diǎn)為根節(jié)點(diǎn)的二叉排序樹中的最小節(jié)點(diǎn)的值,并刪除此節(jié)點(diǎn)public int delRightTreeMin(Node node){Node target = node;//循環(huán)查找左節(jié)點(diǎn),就會(huì)找到最小值while(target.left != null){target = target.left;}//刪除最小節(jié)點(diǎn)delNode(target.value);return target.value;}//刪除節(jié)點(diǎn)public void delNode(int value){if (root == null){return;}else {//1.找到要?jiǎng)h除的節(jié)點(diǎn)Node targetNode = search(value);if (targetNode == null){return;}//如果二叉排序樹只有一個(gè)節(jié)點(diǎn),并且刪除的此節(jié)點(diǎn)if (root.left == null && root.right == null){root = null;return;}//找到父節(jié)點(diǎn)Node parent = searchParent(value);//如果刪除的節(jié)點(diǎn)是葉子節(jié)點(diǎn)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){//刪除有兩棵子樹的(因?yàn)榈诙N判斷比較麻煩,所以直接寫在else里)//從target的右子樹找到最小節(jié)點(diǎn),//用一個(gè)臨時(shí)變量存儲(chǔ)這個(gè)最小節(jié)點(diǎn)的value//刪除最小節(jié)點(diǎn)int min = delRightTreeMin(targetNode.right);//把最小節(jié)點(diǎn)的值賦給targetNodetargetNode.value = min;}else {//第二種,只有一棵子樹//如果要?jiǎng)h除的節(jié)點(diǎn)有左子節(jié)點(diǎn)if (targetNode.left != null){//如果只有根節(jié)點(diǎn)和一個(gè)葉子節(jié)點(diǎn),要?jiǎng)h除根節(jié)點(diǎn),那就要判斷根節(jié)點(diǎn)的父節(jié)點(diǎn)是否為空if (parent != null) {//如果targetNode是parent的左子節(jié)點(diǎn)if (parent.left.value == value) {parent.left = targetNode.left;} else {//targetNode是parent的右子節(jié)點(diǎn)parent.right = targetNode.left;}}else {root = targetNode.left;}}else {//要?jiǎng)h除的節(jié)點(diǎn)有右子節(jié)點(diǎn)if (parent != null) {if (parent.left.value == value) {//如果targetNode是parent的左子節(jié)點(diǎn)parent.left = targetNode.right;} else {//targetNode是parent的右子節(jié)點(diǎn)parent.right = targetNode.right;}}else {root = targetNode.right;}}}}}//添加節(jié)點(diǎn)的方法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("二叉排序樹為空,無法遍歷");}} }//創(chuàng)建節(jié)點(diǎn) class Node{int value;Node left;Node right;public Node(int value) {this.value = value;}//查找要?jiǎng)h除的節(jié)點(diǎn)public Node search(int value){if (value == this.value){//找到return this;}else if(value < this.value){//應(yīng)該向左繼續(xù)查找//如果左子節(jié)點(diǎn)為空就不能找了,說明不存在if (this.left == null) {return null;}return this.left.search(value);}else {if (this.right == null){return null;}return this.right.search(value);}}//查找要?jiǎng)h除節(jié)點(diǎn)的父節(jié)點(diǎn)public Node searchParent(int value){if ((this.left != null && this.left.value == value)||(this.right != null && this.right.value == value)){return this;}else {//如果查找的值小于當(dāng)前節(jié)點(diǎn)的值,并且當(dāng)前節(jié)點(diǎn)的左子節(jié)點(diǎn)不為空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; //沒有父節(jié)點(diǎn)}}}//添加節(jié)點(diǎn)的方法//遞歸的形式添加節(jié)點(diǎn),滿足二叉排序樹public void add(Node node){if(node == null){return;}if (node.value < this.value){//當(dāng)前節(jié)點(diǎn)的左子節(jié)點(diǎn)為空直接掛上if (this.left == null){this.left = node;}else {//不為空遞歸向下this.left.add(node);}}else { //添加的節(jié)點(diǎn)的值大于等于當(dāng)前節(jié)點(diǎn)的值,右節(jié)點(diǎn)為空,掛到右節(jié)點(diǎn)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 +'}';} }總結(jié)
以上是生活随笔為你收集整理的数据结构 - 二叉排序树BST(创建、遍历、删除节点)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win11 2023新预览版25145推
- 下一篇: REVERSE-PRACTICE-BUU