遞歸
方法調用自己本身,叫遞歸
三個要素
邊界條件
遞歸前進段
遞歸返回段
階乘
n!=n*(n-1)(n-2)…*1
0!=1
1!=1
負數沒有階乘
public class JieCheng {
public static int getFactorial(int n) {
if(n==0) {//邊界條件
return 1;
}else if(n>=1){
//遞歸調用
return n*getFactorial(n-1);
}
return -1;
}
public static void main(String[] args) {
System.out.println(getFactorial(0));
System.out.println(getFactorial(1));
System.out.println(getFactorial(-2));
System.out.println(getFactorial(5));
}
}
二分查找
在有序序列(比如有序數組)中,將查找的值跟數組的中間元素的值比較,如果查找值大於數組中間的元素,則繼續到後半部分的範圍查找,如果查找值小於數組中間的元素,則繼續到前半部分的範圍查找,如果等於,則返回該元素。以此類推。
/**
*二分查找
* @author qm
*
*/
public class ErFen {
/**
*
* @param arr 有序數組
* @param key 查找的值
* @param left 下標的起始範圍
* @param right 下標的結束範圍
* @return 查找到的值
*/
public static int search(int[] arr,int key,int left,int right) {
if(key<arr[left]||key>arr[right]) {
return -1;
}
int mid =(left + right)/2;
if(arr[mid]==key) {
return mid;
}else {
if(left>right) {
return -1;
}
if(arr[mid]>key) {
return search(arr,key,left,mid-1);
}else {
return search(arr,key,mid+1,right);
}
}
}
}
漢諾塔
算法:
無論多少個盤子,都看成只有兩個盤子,比如,有N個盤子在塔座A上,我們假設其爲兩個盤子,其中的1到(N-1)個盤子看成一個小盤子,最下面的第N個盤子看成一個大盤子,解決步驟:
(1)先將N-1個盤子從初始塔座A移動到中介塔座B上。
(2)此時將初始塔座A上級僅剩的最大的一個盤子移動到目標塔座C上。
(3)塔座B上還剩下N-1個盤子,塔座A爲空,塔座C仍然爲目標塔座,現在變成了n-1個盤子放到初始塔座B,中介塔座A,目標塔座C的漢諾塔問題了。
/**
* 漢諾塔java實現
*
* @author qm
*
*/
public class HanNuoTa {
public static void move(int dish,String from,String temp,String to) {
if(dish==1) {//只有一個盤子的情況
System.out.println("盤子"+dish+"從"+from+"移動到塔臺"+to);
}else {//遞歸計算
move(dish-1,from,to,temp);
System.out.println("盤子"+dish+"從"+from+"移動到塔臺"+to);
move(dish-1,temp,from,to);
}
}
//主函數調用測試
public static void main(String[] args) {
move(4,"A","B","C");
}
}
樹
根:樹的最頂端的一個節點,叫根,或者根節點。一棵樹只有一個根。
父節點:該節點的下方有連接的子節點,叫父節點
子節點:該節點連接在某個節點的下方,叫子節點
葉子或者葉節點:該節點沒有子節點,我們成爲葉節點
子樹:每個節點及其子節點等可以看爲該樹的子樹。
路徑:某個節點的路徑是指從一個節點一直走到該節點,路過的所有的節點的順序,叫做路徑
兄弟節點:擁有同一個父節點的節點,稱爲兄弟節點。
節點的層次:從根開始定義,根爲第一層,根的子節點爲第二層,以此類推。
深度:對於任意節點,從根節點到該節點的路徑的長度,即爲深度。根節點的深度爲0。
高度:對於任意節點,從該節點到葉片葉子的最長路徑的長度叫高度,所有葉節點的高度爲0。
二叉樹
樹的每一個節點最多有兩個子節點,稱爲二叉樹。
二叉樹中,父節點的兩個子節點,左側爲左子節點,右側爲右子節點。
二叉搜索樹
如果左子樹不爲空,則左子樹上所有節點的值小於他的根節點;如果右子樹不爲空,則右子樹上所有的節點值大於他的根節點。也稱爲二叉排序樹。
查找節點:
查找某個節點,從根節點開始遍歷
1、如果該節點比查找的值大,則搜索其左子樹
2、如果該節點比查找的值小,則搜索右子樹
3、直到找到相等的,或者子樹爲空。
插入節點:
從二叉搜索樹的根節點開始遍歷比較
1、如果小於根節點,則與其左子樹比較。
2、如果大於根節點,則與其右子樹比較
3、按上述規則直到找到爲空的子節點,插入。
遍歷樹:
遍歷樹是指按照一種特定的順序訪問樹的每一個節點。一般有前序遍歷、中序遍歷、後序遍歷。二叉搜索樹一般用中序遍歷。
1、前序:根節點->左子樹->右子樹
2、中序:左子樹->根節點->右子樹
3、後序: 左子樹->右子樹->根節點
前序,中序、後序是按根節點被訪問的順序來命名的。
查找最大和最小值
要找最小值,從根的左子樹開始,一直查找該左節點的左節點,找到最後一個左節點,就是最小值。
找最大值,從根的右子樹開始,一直找該右子樹的右節點,找到最後一個右節點,就最大值。
刪除節點
1、該節點爲葉節點
2、該節點只有一個節點
3、該節點有兩個節點
也可以不刪除節點,在節點中增加一個標誌位,當爲true時,表示該節點被刪除,查找等操作時,先判斷該字段,這樣刪除節點並未改變數的結構。