幾種簡單數據結構

遞歸
方法調用自己本身,叫遞歸
三個要素
邊界條件
遞歸前進段
遞歸返回段
階乘
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時,表示該節點被刪除,查找等操作時,先判斷該字段,這樣刪除節點並未改變數的結構。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章