資料結構—二叉排序樹(Java)
博客說明
文章所涉及的資料來自互聯網整理和個人總結,意在于個人學習和經驗匯總,如有什么地方侵權,請聯系本人洗掉,謝謝!
說明
二叉排序樹:BST: (Binary Sort(Search) Tree), 對于二叉排序樹的任何一個非葉子節點,要求左子節點的值比當前節點的值小,右子節點的值比當前節點的值大
代碼
package cn.guizimo.binarysorttree;
public class BinarySortTree {
public static void main(String[] args) {
int[] arr = {7, 3, 10, 12, 5, 1, 9, 2};
BinarySortTreeDemo binarySortTree = new BinarySortTreeDemo();
for(int i = 0; i< arr.length; i++) {
binarySortTree.add(new Node(arr[i]));
}
System.out.println("中序遍歷");
binarySortTree.infixOrder(); // 1, 3, 5, 7, 9, 10, 12
binarySortTree.delNode(12);
System.out.println("當前根節點root=" + binarySortTree.getRoot());
System.out.println("洗掉后中序遍歷");
binarySortTree.infixOrder();
}
}
class BinarySortTreeDemo {
private Node root;
public Node getRoot() {
return root;
}
//查找當前節點
public Node search(int value) {
if (root == null) {
return null;
} else {
return root.search(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 {
//洗掉葉子節點
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 (parent.left != null && parent.left.value =https://www.cnblogs.com/guizimo/p/= value) {
parent.left = null;
} else if (parent.right != null && parent.right.value == value) {
parent.right = null;
}
//洗掉兩顆子樹的節點
} else if (targetNode.left != null && targetNode.right != null) {
int i = delRightTreeMin(targetNode.right);
targetNode.value = i;
//洗掉一顆子樹的節點
} else {
if (targetNode.left != null) {
if (parent != null) {
if (parent.left.value == value) {
parent.left = targetNode.left;
} else {
parent.right = targetNode.right;
}
} else {
root = targetNode.left;
}
} else {
if (parent != null) {
if (parent.left.value == value) {
parent.left = targetNode.right;
} else if (parent.right.value == value) {
parent.right = targetNode.right;
}
} else {
root = targetNode.right;
}
}
}
}
}
//查詢當前節點的父節點
public Node searchParent(int value) {
if (root == null) {
return null;
} else {
return root.searchParent(value);
}
}
//添加節點
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;
}
@Override
public String toString() {
return "Node{" +
"value=" + value +'}';
}
//查找節點
public Node search(int value) {
if (value =https://www.cnblogs.com/guizimo/p/= 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();
}
}
}
測驗

感謝
尚硅谷
以及勤勞的自己
關注公眾號: 歸子莫,獲取更多的資料,還有更長的學習計劃
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/38596.html
標籤:Java
上一篇:Java比較器:Comparator介面與Comparable介面的compare(compareTo)方法回傳值的正負與升序、降序的關系
下一篇:資料結構—平衡二叉樹(Java)
