Java基礎知識複習(十)-- 二叉樹排序
阿新 • • 發佈:2019-01-02
二叉樹
二叉樹由各種節點組成
二叉樹特點:
每個節點都可以有左子節點,右子節點
每一個節點都有一個值
二叉樹排序
假設通過二叉樹對如下10個隨機數進行排序
67,7,30,73,10,0,78,81,10,74
排序的第一個步驟是把資料插入到該二叉樹中,插入基本邏輯是,小、相同的放左邊,大的放右邊
- 67 放在根節點
- 7 比 67小,放在67的左節點
- 30 比67 小,找到67的左節點7,30比7大,就放在7的右節點
- 73 比67大, 放在67得右節點
- 10 比 67小,找到67的左節點7,10比7大,找到7的右節點30,10比30小,放在30的左節點。 … …
- 10比67小,找到67的左節點7,10比7大,找到7的右節點30,10比30小,找到30的左節點10,10和10一樣大,放在左邊
遍歷二叉樹
通過上一個步驟的插入行為,實際上,資料就已經排好序了。 接下來要做的是看,把這些已經排好序的資料,遍歷成我們常用的List或者陣列的形式
二叉樹的遍歷分先序,中序,後序
先序即: 先遍歷根節點,再依次遍歷左子樹,右子樹
中序即: 先遍歷左子樹,再依次遍歷根節點,右子樹
後序即: 先遍歷左右子樹,再遍歷根節點
參考程式碼
package review5;
import java.util.ArrayList;
import java.util.List;
public class Node {
public Node leftNode;
public Node rightNode;
public int value;
public void add(int v) {
// 當前節點為空
if(value == 0) {
value = v;
}
//當前節點不為空
else {
//插入值小於等於當前節點值,放到二叉樹左邊
if(v <= value) {
//左子樹為空
if(leftNode == null) {
leftNode = new Node();
}
leftNode.add(v);
}
//插入值大於等於當前節點值,放到二叉樹右邊
else {
if(rightNode == null) {
rightNode = new Node();
}
rightNode.add(v);
}
}
}
public List<Integer> values(){
//中序遍歷
List<Integer> values = new ArrayList<>();
//遍歷左子樹
if(leftNode != null) {
values.addAll(leftNode.values());
}
//當前節點
values.add(value);
//遍歷右子樹
if (rightNode != null) {
values.addAll(rightNode.values());
}
return values;
}
public static void main(String[] args) {
int[] a = new int[10];
for(int i = 0; i < 10; i++) {
a[i] = (int) (Math.random()*100+1);
}
Node root = new Node();
for(int num : a) {
root.add(num);
System.out.print(num+",");
}
System.out.println();
System.out.println(root.values());
}
}