1、哈希表
2、樹
public class TreeNode {
private int no;
private TreeNode leftNode;
private TreeNode rightNode;
public TreeNode(int no) {
this.no = no;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public TreeNode getLeftNode() {
return leftNode;
}
public void setLeftNode(TreeNode leftNode) {
this.leftNode = leftNode;
}
public TreeNode getRightNode() {
return rightNode;
}
public void setRightNode(TreeNode rightNode) {
this.rightNode = rightNode;
}
@Override
public String toString() {
return "TreeNode{" +
"no=" + no +
", leftNode=" + leftNode +
", rightNode=" + rightNode +
'}';
}
//前序遍歷
public void preOrder(){
System.out.println(this);
if(this.leftNode!=null){
this.leftNode.preOrder();
}
if(this.rightNode!=null){
this.rightNode.preOrder();
}
}
//中序遍歷
public void infixOrder(){
if(this.leftNode!=null){
this.leftNode.infixOrder();
}
System.out.println(this);
if(this.rightNode!=null){
this.rightNode.infixOrder();
}
}
//後序遍歷
public void postOrder(){
if(this.leftNode!=null){
this.leftNode.postOrder();
}
if(this.rightNode!=null){
this.rightNode.postOrder();
}
System.out.println(this);
int[] a = {1,2};
Arrays.copyOfRange(a, 1, 2);
}
//前序遍歷查找,num是要查找的結點數據
public TreeNode preOrderSearch(int num){
if(this.no==num){
return this;
}
//因爲是前序遍歷所以先判斷左子樹
TreeNode resNode = null;
if(this.leftNode!=null){
this.leftNode.preOrderSearch(num);
}
if(resNode!=null){//說明找到了
return resNode;
}
if(this.rightNode!=null){
resNode = this.rightNode.preOrderSearch(num);
}
if(resNode!=null){
return resNode;
}
return resNode;
}
}
//順序二叉樹(堆排序就會使用順序存儲二叉樹) 第n個節點的左子節點是2n+1;第n個節點的右子節點是2n+1,父節點是(n-1)/2,n是數組下標,也表示二叉樹的第幾個元素 //線索二叉樹,二叉樹n個節點有n+1個空指針域,利用空指針域存放指向該節點的前驅和後繼節點,有前序線索二叉樹,中序線索二叉樹,和後續線索二叉樹。
//堆排序,升序需要用大頂堆,降序需要用小頂堆
public static void heapSort(int arr[]){
int temp =0;
//構建大頂堆
for(int i=arr.length/2-1;i>0;i--){
adjustHeap(arr,i,arr.length);
}
for(int j=arr.length-1;j>0;j--){
//交換
temp=arr[j];
arr[j]=arr[0];
arr[0] = temp;
adjustHeap(arr,0,j);
}
}
//構建大頂堆,length會逐漸變短,i表示在數組中的索引
public static void adjustHeap(int arr[], int i, int length){
int temp= arr[i];
for(int k=i*2+1;k<arr.length;k=k*2+1){//i*2+1是i節點的左子節點
if(k+1<length && arr[k]<arr[k+1]){//說明左子節點小於右子節點
k++;//k指向右子節點
}
if(arr[k]>temp){//子節點當中的最大節點和當前節點比較
arr[i]=arr[k];
i=k;//繼續循環比較
}
}
//循環結束,將當前值放回給最終交換的位置
arr[i]=temp;
}
//赫夫曼樹(WPL最小的樹就是赫夫曼樹,在網絡中的應用是赫夫曼編碼實現解壓縮等)
//二叉排序樹BST,任何一個非葉子結點要求左子節點的值比當前節點小,右子節點的值比當前節點大,刪除時要判斷刪除的節點包含幾個節點,根據情況不同進行刪除
//平衡二叉樹(AVL樹,二叉搜索樹),因爲二叉排序樹不平衡,可能變成類似列表的情況,查詢速度明顯降低。 他的左右子樹的高度差的絕對值不超過1;實現方法有紅黑樹、AVL、替罪羊樹、Treap、伸展樹
public int height(){//計算當前節點樹的高度
return Math.max(leftNode==null?0 : leftNode.height(),rightNode==null?0 : rightNode.height());
}
//左旋 //右旋
3、多叉樹:2-3樹、B-樹(B樹)、B+樹、B*樹
4、圖:
/**
* Created by qililong on 2020/7/6.
* 圖,有鄰接矩陣、鄰接表
*/
public class Graph {
//鄰接矩陣方式
//插入節點
private ArrayList<String> vertexList;//存儲頂點集合
private int[][] edges;//存儲圖的鄰接矩陣
private boolean[] isVisited; //記錄節點是否被訪問
public void insertVertex(String vertex){
vertexList.add(vertex);
}
}
深度優先:
廣度優先: