二叉搜索樹的后序遍歷序列(Java)

飛來科技  發布時間:2019-08-07 14:04:33

本文關鍵詞:序列二叉排序樹

排序二叉樹的遍歷_二叉樹的排序_序列二叉排序樹

題目:

輸入一個整數數組,判斷該數組是不是某二叉搜索樹的后序遍歷的結果。如果是則返回true。否則返回false。假設輸入的數組的任意兩個數字都互不相同。

思路:

滿二叉樹:從高到低,除了葉結點外,所有結點的左右結點都存在。

完全二叉樹:比滿二叉樹少幾個葉結點,從左向右放子結點。

排序二叉樹的遍歷_二叉樹的排序_序列二叉排序樹

平衡二叉樹:空樹或者它的左右兩個子樹的高度差的絕對值不超過1,并且左右兩個子樹也都是平衡樹。、

二叉搜索樹:空樹或者二叉樹的所有結點比它的左子結點大,比它的右子結點小。

例如輸入數組{5, 7, 6, 9, 11, 10, 8},則返回true,因為這個整數序列是上圖二叉搜索樹的后序遍歷結果。如果輸入的數組是{7, 4, 6, 5},由于沒有哪顆二叉搜索樹的后序遍歷的結果是這個序列,因此返回false。

當結點加入到樹中去時,該結點 parent 的值為其父結點在數組 huffnode 中的序號,而不會是 -1 了。初始時parent 的值為-1,當結點加入到樹中時,該結點parent 的值為其雙親結點在數組huffnode 中的序號,就不會是-1 了。由結點售互不相同而后序序列與中序序列相同,可知該二叉樹所有的結點都沒有右子樹,所以31個結點的二叉樹深度為31:故選a選項。

序列二叉排序樹_排序二叉樹的遍歷_二叉樹的排序

以數組{5, 7, 6, 9, 11, 10, 8}為例,后序遍歷的結果中最后一個值8就是根結點,在這個數組中前3個數字5,7,6都比8小是根結點8的左子樹結點;后3個數字9序列二叉排序樹, 11, 10都比8大,是根結點8的右子樹結點。

接下來用同樣的方法確定與數組每一部分對應的子樹的結構。這其實就是一個遞歸的過程。對于序列5, 7, 6的子樹而言,6是根結點,5是根結點6的左子結點,7是根結點6的右子結點;同樣對于序列9, 11, 10的子樹而言,10是根結點,9是根結點10的左子結點,11是根結點10的右子結點。

(1) a、根結點無左子樹的二叉樹 b、根結點無右子樹的二叉樹c、只有根結點的二叉樹或非葉子結點只有左子樹的二叉樹d、只有根結點的二叉樹或非葉子結點只有右子樹的二叉樹(2) a、非葉子結點只有左子樹的二叉樹 b、只有根結點的二叉樹 c、根結點無右子樹的二叉樹 d、非葉子結點只有右子樹的二叉樹 10、 假設一棵二叉樹的后序遍歷序列為 dgjhebifca,中序遍歷序列為 dbgehjacif,則其前序遍歷序列為 (10) 。先序遞歸遍歷建立二叉樹的方法為:按照先序遞歸遍歷的思想將對二叉樹結點的抽象訪問具體化為根據接收的數據決定是否產生該結點從而實現創建該二叉樹的二叉鏈表存儲結構。}不難分析,上述算法的時間復雜度同樣為 o(n) 7.6.3 二叉樹的線索化算法對--x 樹的線索化,就是把二叉樹的二叉鏈表存儲結構中結點的所有空指針域改造成指向某結點在某種遍歷序列中的直接前驅或直接后繼的過程, 因此, 二叉樹的線索化過程只能在對二叉樹的遍歷過程中進行。

代碼實現:

public boolean verifySquenceOfBST(int sequence[]){
	if(sequence == null){
		return false;
	}
	return verifySquenceOfBST1(sequence, 0, sequence.length - 1);
}
private boolean verifySquenceOfBST1(int[] sequence, int start, int end) {
	if(start >= end){
		return true;
	}
	int root = sequence[end]; //后序遍歷的最后一個結點為根結點
		
	//在二叉搜索樹中左子樹的結點小于根結點
	int i = 0;
	for(; i < end; ++i){
		if(sequence[i] > root){
			break;
		}
	}
		
	//在二叉搜索樹中右子樹的結點大于根結點
	int j = i;
	for(; j < end; ++j){
		if(sequence[j] < root){
			return false;
		}
	}
	//判斷左子樹是不是二叉樹
	boolean left = true;
	if(i > start){
		left = verifySquenceOfBST1(sequence, start, i-1);
	}
	//判斷右子樹是不是二叉樹
	boolean right = true;
	if(i < end){
		right = verifySquenceOfBST1(sequence, i, end -1); 
	}
	return (left && right);
}

二叉樹的排序_排序二叉樹的遍歷_序列二叉排序樹

小結:

解決這道題目的關鍵在于是否能找到二叉搜樹的后序遍歷的規律。一旦找到規律了,用遞歸的代碼編碼相對就簡單多了。

擴展:

輸入一個數組,判斷該數組是不是某二叉搜索樹的前序遍歷的結果。

思路:

二叉樹的排序_序列二叉排序樹_排序二叉樹的遍歷

這其實和上面的二叉搜索樹的后序遍歷規律是一樣的,不過后序遍歷根結點在后面,前序遍歷根結點在前面而已序列二叉排序樹,即第一個就是根結點的值。

代碼實現:

public boolean verifySquenceOfBST(int sequence[]){
	if(sequence == null){
		return false;
	}
	return verifySquenceOfBST1(sequence, 0, sequence.length - 1);
}
private boolean verifySquenceOfBST1(int[] sequence, int start, int end) {
	if(start < end){
		return false;
	}
	int root = sequence[start]; //后序遍歷的最后一個結點為根結點
		
	//在二叉搜索樹中左子樹的結點小于根結點
	int i = 1;
	for(; i < end; ++i){
		if(sequence[i] > root){
			break;
		}
	}
		
	//在二叉搜索樹中右子樹的結點大于根結點
	int j = i;
	for(; j < end; ++j){
		if(sequence[j] < root){
			return false;
		}
	}
	//判斷左子樹是不是二叉樹
	boolean left = true;
	if(i > start+1){
		left = verifySquenceOfBST1(sequence, start+1, i-1);
	}
	//判斷右子樹是不是二叉樹
	boolean right = true;
	if(i < end){
		right = verifySquenceOfBST1(sequence, i, end); 
	}
	return (left && right);
}

小思:

在遞歸遍歷 view-viewcontroller 樹時,子節點的 stack 信息由父節點的 stack 信息加上子結點信息即可。 ccf noip2010 初賽 普及組 c 2 17.一棵二叉樹的前序遍歷序列是 abcdefg,后序遍歷序列是 cbfegda,則根結點的左 子樹的結點...。樹形控件可以用于樹形的結構,其中有一個根接點(root)然后下面有許多子結點,而每個子結點上有允許有一個或多個或沒有子結點。

本文來自互聯網,由機器人自動采編,文章內容不代表本站觀點,請讀者自行辨別信息真偽,如有發現不適內容,請及時聯系站長處理。

    相關閱讀
    二四六天天好彩每期文字賧料